Ë
    £èhÀÎ  ã                  ó€  — d dl mZ d dlmZmZmZmZmZ d dlZd dl	Z	d dl
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mZmZmZmZmZmZmZmZ d dlm Z  erd dl!m"Z" g d	¢Z#e	jH                   G d
„ de	jJ                  «      «       Z&e	jH                   G d„ de	jJ                  «      «       Z' G d„ dejP                  «      Z) G d„ dejP                  «      Z* G d„ d«      Z+	 d#	 	 	 	 	 	 	 d$d„Z,d%d„Z-	 	 	 	 d&d„Z. G d„ de)«      Z/ G d„ de)«      Z0 G d„ de*«      Z1 G d„ de*«      Z2 G d„ d e*«      Z3 G d!„ d"e*«      Z4de1e2e3e4gZ5y)'é    )Úannotations)ÚUnionÚIterableÚSequenceÚOptionalÚTYPE_CHECKINGN)Úconst)ÚTagsÚ
group_tags)ÚVec2ÚVec3ÚUVecÚOCSÚbulge_to_arcÚConstructionEllipseÚConstructionArcÚBSplineÚNonUniformScalingErrorÚopen_uniform_knot_vectorÚglobal_bspline_interpolationÚarc_angle_span_degÚangle_to_paramÚparam_to_angle)ÚOCSTransform)ÚAbstractTagWriter)ÚBoundaryPathsÚPolylinePathÚEdgePathÚLineEdgeÚArcEdgeÚEllipseEdgeÚ
SplineEdgeÚEdgeTypeÚBoundaryPathTypeÚAbstractEdgeÚAbstractBoundaryPathc                  ó   — e Zd ZdZdZy)r$   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚPOLYLINEÚEDGE© ó    ú=lib/python3.12/site-packages/ezdxf/entities/boundary_paths.pyr$   r$   /   s   „ à€HØ�Dr0   r$   c                  ó   — e Zd ZdZdZdZdZy)r#   r(   r)   é   é   N)r*   r+   r,   ÚLINEÚARCÚELLIPSEÚSPLINEr/   r0   r1   r#   r#   5   s   „ à€DØ
€CØ€GØ�Fr0   r#   c                  óô   — e Zd ZU ded<   ded<   ded<   ej
                  dd„«       Zeej
                  dd„«       «       Zej
                  dd	„«       Z	ej
                  dd
„«       Z
ej
                  dd„«       Zy)r&   r$   ÚtypeÚintÚpath_type_flagsú	list[str]Úsource_boundary_objectsc                 ó   — y ©Nr/   ©Úselfs    r1   ÚclearzAbstractBoundaryPath.clearB   s   € Ø r0   c                 ó   — y r@   r/   )ÚclsÚtagss     r1   Ú	load_tagszAbstractBoundaryPath.load_tagsE   s   € à<?r0   c                 ó   — y r@   r/   )rB   Ú	tagwriterÚdxftypes      r1   Ú
export_dxfzAbstractBoundaryPath.export_dxfI   s   € ØNQr0   c                 ó   — y r@   r/   ©rB   ÚocsÚ	elevations      r1   Ú	transformzAbstractBoundaryPath.transformL   ó   € ØFIr0   c                 ó   — y r@   r/   rA   s    r1   Úis_validzAbstractBoundaryPath.is_validO   ó   € Ø #r0   N©ÚreturnÚNone)rF   r
   rV   r&   ©rI   r   rJ   ÚstrrV   rW   ©rN   r   rO   ÚfloatrV   rW   ©rV   Úbool)r*   r+   r,   Ú__annotations__ÚabcÚabstractmethodrC   ÚclassmethodrG   rK   rP   rS   r/   r0   r1   r&   r&   =   s€   … Ø
ÓØÓØ&Ó&à×ÑÚ ó Ø àØ×ÑÚ?ó ó à?à×ÑÚQó ØQà×ÑÚIó ØIà×ÑÚ#ó Ù#r0   r&   c                  ó  — e Zd ZU ded<   eej                  dd„«       «       Zeej                  dd„«       «       Zej                  dd„«       Z	ej                  dd„«       Z
ej                  dd„«       Zedd„«       Zedd	„«       Zy
)r%   r#   r:   c                 ó   — y r@   r/   rA   s    r1   Ústart_pointzAbstractEdge.start_pointV   s   € à#&r0   c                 ó   — y r@   r/   rA   s    r1   Ú	end_pointzAbstractEdge.end_pointZ   s   € à!$r0   c                 ó   — y r@   r/   )rB   rI   s     r1   rK   zAbstractEdge.export_dxf^   s   € Ø@Cr0   c                 ó   — y r@   r/   rM   s      r1   rP   zAbstractEdge.transforma   rQ   r0   c                 ó   — y r@   r/   rA   s    r1   rS   zAbstractEdge.is_validd   rT   r0   c                ó   — | j                   S r@   )rd   rA   s    r1   Úreal_start_pointzAbstractEdge.real_start_pointg   s   € à×ÑÐr0   c                ó   — | j                   S r@   )rf   rA   s    r1   Úreal_end_pointzAbstractEdge.real_end_pointk   s   € à�~‰~Ðr0   N©rV   r   ©rI   r   rV   rW   rZ   r\   )r*   r+   r,   r^   Úpropertyr_   r`   rd   rf   rK   rP   rS   rk   rm   r/   r0   r1   r%   r%   S   s¡   … Ø
ƒNàØ×ÑÚ&ó ó à&àØ×ÑÚ$ó ó à$à×ÑÚCó ØCà×ÑÚIó ØIà×ÑÚ#ó Ø#àò ó ð ð òó ñr0   r%   c                  ó0  — e Zd Zddd„Zd„ Zd„ Zd„ Zdd„Zedd„«       Z	e
dd„«       Zd d	„Zd!d
„Zd!d„Zd!d„Zej"                  f	 	 	 d"d„Zd#d„Z	 	 d$	 	 	 	 	 	 	 d%d„Zd&d'd„Zd(d„Zd)d*d„Zd+d d„Zd,d-d„Zd d„Zd.d/d„Zd0d1d„Zd2d/d„Zd2d/d„Zd3d4d„Zdd„Z y)5r   Nc                ó   — |xs g | _         y r@   ©Úpaths)rB   rt   s     r1   Ú__init__zBoundaryPaths.__init__q   s   € Ø16²¸"ˆ�
r0   c                ó,   — t        | j                  «      S r@   )Úlenrt   rA   s    r1   Ú__len__zBoundaryPaths.__len__t   s   € Ü�4—:‘:‹Ðr0   c                ó    — | j                   |   S r@   rs   )rB   Úitems     r1   Ú__getitem__zBoundaryPaths.__getitem__w   s   € Ø�z‰z˜$ÑÐr0   c                ó,   — t        | j                  «      S r@   )Úiterrt   rA   s    r1   Ú__iter__zBoundaryPaths.__iter__z   ó   € Ü�D—J‘JÓÐr0   c                ó:   — t        d„ | j                  D «       «      S )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr@   ©rS   ©Ú.0Úps     r1   Ú	<genexpr>z)BoundaryPaths.is_valid.<locals>.<genexpr>~   ó   è ø€ Ð4© A�1—:‘:—<©ùó   ‚)Úallrt   rA   s    r1   rS   zBoundaryPaths.is_valid}   ó   € ÜÑ4¨¯ªÓ4Ó4Ð4r0   c                ó(  — g }|d   j                   dk(  sJ ‚t        |d¬«      }|D ]c  }|d   j                  }t        |dz  «      }|rt        j                  |«      nt        j                  |«      }||_        |j                  |«       Œe  | |«      S )Nr   é\   ©Ú	splitcoder)   )	Úcoder   Úvaluer]   r   rG   r   r<   Úappend)rE   rF   rt   Úgrouped_path_tagsÚ	path_tagsr<   Úis_polyline_pathÚpaths           r1   rG   zBoundaryPaths.load_tags€   s�   € àˆØ�A‰w�|‰|˜rÒ!Ð!Ð!Ü& t°rÔ:ÐÛ*ˆIØ'¨™l×0Ñ0ˆOÜ# O°aÑ$7Ó8Ðñ $ô ×&Ñ& yÔ1ä×'Ñ'¨	Ó2ð ð
 $3ˆDÔ Ø�L‰L˜Õð +ñ �5‹zÐr0   c                ó:   — t        d„ | j                  D «       «      S )Nc              3  óV   K  — | ]!  }|j                   t        j                  k(  –— Œ# y ­wr@   )r:   r$   r.   rƒ   s     r1   r†   z/BoundaryPaths.has_edge_paths.<locals>.<genexpr>“   s!   è ø€ ÐG¹J°q�1—6‘6Ô-×2Ñ2Õ2¹Jùs   ‚'))Úanyrt   rA   s    r1   Úhas_edge_pathszBoundaryPaths.has_edge_paths‘   s   € äÑG¸D¿JºJÓGÓGÐGr0   c                ó   — g | _         y)zRemove all boundary paths.Nrs   rA   s    r1   rC   zBoundaryPaths.clear•   ó	   € àˆ�
r0   c              #  ór   K  — | j                   D ]$  }|j                  t        j                  z  sŒ!|–— Œ& y­w)z+Iterable of external paths, could be empty.N)rt   r<   r	   ÚBOUNDARY_PATH_EXTERNAL©rB   Úbs     r1   Úexternal_pathszBoundaryPaths.external_paths™   s-   è ø€ à—”ˆAØ× Ñ ¤5×#?Ñ#?Ó?Ø“ñ ùó   ‚-7°7c              #  ór   K  — | j                   D ]$  }|j                  t        j                  z  sŒ!|–— Œ& y­w)z,Iterable of outermost paths, could be empty.N)rt   r<   r	   ÚBOUNDARY_PATH_OUTERMOSTrž   s     r1   Úoutermost_pathszBoundaryPaths.outermost_pathsŸ   s-   è ø€ à—”ˆAØ× Ñ ¤5×#@Ñ#@Ó@Ø“ñ ùr¡   c              #  ó®   K  — t         j                  t         j                  z   }| j                  D ]!  }t	        |j
                  |z  «      du sŒ|–— Œ# y­w)z*Iterable of default paths, could be empty.FN)r	   r£   r�   rt   r]   r<   )rB   Únot_defaultrŸ   s      r1   Údefault_pathszBoundaryPaths.default_paths¥   sG   è ø€ ä×3Ñ3´e×6RÑ6RÑRˆØ—”ˆAÜ�A×%Ñ%¨Ñ3Ó4¸Ò=Ø“ñ ùs   ‚AAÁAc                óÌ   ‡‡— dd„Št        ˆfd„t        | j                  «      D «       «      }dŠ|t        j                  k(  rdŠn|t        j
                  k(  rdŠˆfd„|D «       S )am  Iterable of paths to process for rendering, filters unused
        boundary paths according to the given hatch style:

        - NESTED: use all boundary paths
        - OUTERMOST: use EXTERNAL and OUTERMOST boundary paths
        - IGNORE: ignore all paths except EXTERNAL boundary paths

        Yields paths in order of EXTERNAL, OUTERMOST and DEFAULT.

        c                óT   — | t         j                  z  ry| t         j                  z  ryy)Nr   r(   r)   )r	   r�   r£   ©Úflagss    r1   Úpath_type_enumz5BoundaryPaths.rendering_paths.<locals>.path_type_enumº   s'   € Ø”u×3Ñ3Ò3ØØœ×6Ñ6Ò6ØØr0   c              3  óN   •K  — | ]  \  }} ‰|j                   «      ||f–— Œ y ­wr@   )r<   )r„   Úir…   r¬   s      €r1   r†   z0BoundaryPaths.rendering_paths.<locals>.<genexpr>Á   s,   øè ø€ ð 
ÙBW¹$¸!¸Q‰^˜A×-Ñ-Ó.°°1Ô5ÑBWùs   ƒ"%r(   r3   r)   c              3  ó6   •K  — | ]  \  }}}|‰k  sŒ|–— Œ y ­wr@   r/   )r„   Ú	path_typeÚ_r…   Úignores       €r1   r†   z0BoundaryPaths.rendering_paths.<locals>.<genexpr>É   s   øè ø€ ÐE©‘o�i  A°)¸fÓ2D”©ùs   ƒ’)rV   r;   )ÚsortedÚ	enumeratert   r	   ÚHATCH_STYLE_NESTEDÚHATCH_STYLE_OUTERMOST)rB   Úhatch_stylert   r²   r¬   s      @@r1   Úrendering_pathszBoundaryPaths.rendering_paths¬   sb   ù€ ó	ô ó 
ÜBKÈDÏJÉJÔBWó
ó 
ˆð ˆØœ%×2Ñ2Ò2Ø‰FØœE×7Ñ7Ò7ØˆFÛE©ÓEÐEr0   c                óˆ   — t        |t        «      st        dt        |«      › �«      ‚| j                  j                  |«       y)zCAppend a new boundary path.

        .. versionadded:: 1.4
        zinvalid path type: N)Ú
isinstancer&   Ú	TypeErrorr:   rt   r‘   )rB   r•   s     r1   r‘   zBoundaryPaths.appendË   s8   € ô
 ˜$Ô 4Ô5ÜÐ1´$°t³*°Ð>Ó?Ð?Ø�
‰
×Ñ˜$Õr0   c                óV   — t         j                  |||«      }| j                  |«       |S )aA  Create and add a new :class:`PolylinePath` object.

        Args:
            path_vertices: iterable of polyline vertices as (x, y) or
                (x, y, bulge)-tuples.
            is_closed: 1 for a closed polyline else 0
            flags: default(0), external(1), derived(4), textbox(8) or outermost(16)

        )r   Úfrom_verticesr‘   )rB   Úpath_verticesÚ	is_closedr«   Únew_paths        r1   Úadd_polyline_pathzBoundaryPaths.add_polyline_pathÔ   s)   € ô  ×-Ñ-¨m¸YÈÓNˆØ�‰�HÔØˆr0   c                óJ   — t        «       }||_        | j                  |«       |S )z›Create and add a new :class:`EdgePath` object.

        Args:
            flags: default(0), external(1), derived(4), textbox(8) or outermost(16)

        )r   r<   r‘   )rB   r«   rÀ   s      r1   Úadd_edge_pathzBoundaryPaths.add_edge_pathç   s$   € ô “:ˆØ#(ˆÔ Ø�‰�HÔØˆr0   c                ó”   — |j                  dt        | j                  «      «       | j                  D ]  }|j                  ||«       Œ y )Né[   )Ú
write_tag2rw   rt   rK   )rB   rI   rJ   r•   s       r1   rK   zBoundaryPaths.export_dxfó   s6   € Ø×Ñ˜R¤ T§Z¡Z£Ô1Ø—J”JˆDØ�O‰O˜I wÕ/ñ r0   c                ó¨   — |j                   s"| j                  d¬«       | j                  «        | j                  D ]  }|j	                  ||¬«       Œ y)zoTransform HATCH boundary paths.

        These paths are 2d elements, placed in the OCS of the HATCH.

        T©Újust_with_bulge©rO   N)Úscale_uniformÚpolyline_to_edge_pathsÚarc_edges_to_ellipse_edgesrt   rP   )rB   rN   rO   r•   s       r1   rP   zBoundaryPaths.transformø   sH   € ð × Ò Ø×'Ñ'¸Ð'Ô=Ø×+Ñ+Ô-à—J”JˆDØ�N‰N˜3¨)ˆNÕ4ñ r0   c                óÆ   ‡— dd„Šdˆfd„}t        | j                  «      D ]>  \  }}t        |t        «      sŒ|r|j	                  «       sŒ* ||«      | j                  |<   Œ@ y)zÊConvert polyline paths including bulge values to line- and arc edges.

        Args:
            just_with_bulge: convert only polyline paths including bulge
                values if ``True``

        c              3  óì  K  — d }d}| D �]f  \  }}}t        ||«      }|€|}|}Œ|dk7  rût        «       }t        |||«      \  |_        }}	|_        |j                  t        j                  ||j                  «      z   }
|
j                  |d¬«      |_        t        j                  |«      dz  |_        t        j                  |	«      dz  |_        t        j                  |j                  |j                  «      r't        j                  |j                  d«      rd|_        |–— nHt        «       }|j                  |j                  f|_        |j                  |j                  f|_        |–— |}|}�Œi y ­w)Nç        g•Ö&è.>)Úabs_tolç     €v@r   )r   r    r   ÚcenterÚradiusr   Ú
from_angleÚiscloseÚccwÚmathÚdegreesÚstart_angleÚ	end_angler   ÚxÚyÚstartÚend)ÚpointsÚ
prev_pointÚ
prev_bulgerÜ   rÝ   ÚbulgeÚpointÚarcrÚ   rÛ   Ú	chk_pointÚlines               r1   Ú_edgesz4BoundaryPaths.polyline_to_edge_paths.<locals>._edges  sF  è ø€ Ø&*ˆJØ #ˆJÜ%‘��1�eÜ˜Q ›
�ØÐ%Ø!&�JØ!&�JØà Ò$Ü!›)�Cô % Z°¸
ÓCñØœ
Ø#Ø!Øœ
à #§
¡
¬T¯_©_¸[È#Ï*É*Ó-UÑ U�IØ'×/Ñ/°
ÀDÐ/ÓI�C”GÜ&*§l¡l°;Ó&?À%Ñ&G�C”OÜ$(§L¡L°Ó$;¸eÑ$C�C”MÜ—|‘| C§O¡O°S·]±]ÔCÌÏÉØŸ™¨ôIð ).˜œØ“Iä#›:�DØ",§,¡,°
·±Ð!=�D”JØ %§¡¨¯©Ð1�D”HØ’Jà"�
Ø"’
ñC  &ùs   ‚E2E4c                ó²   •— t        «       }t        | j                  «      }| j                  r|j	                  |d   «       t         ‰|«      «      |_        |S ©Nr   )r   ÚlistÚverticesr¿   r‘   Úedges)Úpolyline_pathÚ	edge_pathrì   rè   s      €r1   Úto_edge_pathz:BoundaryPaths.polyline_to_edge_paths.<locals>.to_edge_path4  sJ   ø€ Ü ›
ˆIÜ! -×"8Ñ"8Ó9ˆHØ×&Ò&Ø—‘ ¨¡Ô,Ü"¡6¨(Ó#3Ó4ˆIŒOØÐr0   N)rV   z"Iterable[Union[LineEdge, ArcEdge]])rV   r   )r´   rt   rº   r   Ú	has_bulge)rB   rÉ   rð   Ú
path_indexr•   rè   s        @r1   rÌ   z$BoundaryPaths.polyline_to_edge_paths  sT   ø€ ó$	#õL	ô !*¨$¯*©*Ö 5ÑˆJ˜Ü˜$¤Õ-Ù"¨4¯>©>Ô+;ØÙ)5°dÓ);�—
‘
˜:Ò&ñ	 !6r0   c                ó®   — g }| j                   D ]=  }|j                  t        j                  k(  rt	        |||«      }|j                  |«       Œ? || _         y)ae  Convert all edge paths to simple polyline paths without bulges.

        Args:
            distance: maximum distance from the center of the curve to the
                center of the line segment between two approximation points to
                determine if a segment should be subdivided.
            segments: minimum segment count per curve

        N)rt   r:   r$   r.   Úflatten_to_polyline_pathr‘   )rB   ÚdistanceÚsegmentsÚ	convertedr•   s        r1   Úedge_to_polyline_pathsz$BoundaryPaths.edge_to_polyline_pathsB  sO   € ð ˆ	Ø—J”JˆDØ�y‰yÔ,×1Ñ1Ò1Ü/°°hÀÓI�Ø×Ñ˜TÕ"ð ð ˆ�
r0   c                óÆ   — dd„}| j                   D ]N  }t        |t        «      sŒ|j                  }t	        |«      D ]!  \  }}t        |t
        «      sŒ ||«      ||<   Œ# ŒP y)z'Convert all arc edges to ellipse edges.c                óÖ   — t        «       }| j                  |_        d|_        | j                  df|_        | j
                  |_        | j                  |_        | j                  |_        |S )Nç      ð?rÐ   )r!   rÓ   ÚratiorÔ   Ú
major_axisrÚ   rÛ   r×   )rå   Úellipses     r1   Ú
to_ellipsez<BoundaryPaths.arc_edges_to_ellipse_edges.<locals>.to_ellipseV  sT   € Ü!“mˆGØ ŸZ™ZˆGŒNØˆGŒMØ"%§*¡*¨cÐ!2ˆGÔØ"%§/¡/ˆGÔØ #§¡ˆGÔØŸ'™'ˆGŒKØˆNr0   N)rå   r    rV   r!   )rt   rº   r   rí   r´   r    )rB   rÿ   r•   rí   Ú
edge_indexÚedges         r1   rÍ   z(BoundaryPaths.arc_edges_to_ellipse_edgesS  sW   € ó	ð —J”JˆDÜ˜$¤Õ)ØŸ
™
�Ü(1°%Ö(8Ñ$�J Ü! $¬Õ0Ù,6°tÓ,<˜˜jÒ)ñ )9ñ r0   c                óä   ‡— dˆfd„}t        | j                  «      D ]Q  \  }}t        |t        «      sŒ|j                  }t        |«      D ]!  \  }}t        |t
        «      sŒ ||«      ||<   Œ# ŒS y)zõ
        Convert all ellipse edges to spline edges (approximation).

        Args:
            num: count of control points for a **full** ellipse, partial
                ellipses have proportional fewer control points but at least 3.

        c                ó:  •— t        | j                  | j                  | j                  | j                  | j
                  ¬«      }t        t        t        ‰«      |j                  z  t        j                  z  «      d«      }t        j                  ||«      }t        «       }|j                  |_        | j                   s|j#                  «       }t%        j&                  |j(                  «      |_        |j+                  «       |_        |j/                  «       |_        |S )N©rÓ   rý   rü   Ústart_paramÚ	end_paramr3   )r   rÓ   rý   rü   r  r  Úmaxr;   r[   Ú
param_spanrØ   Útaur   Úellipse_approximationr"   Údegreer×   Úreverser   rë   Úcontrol_pointsÚknotsÚknot_valuesÚweights)Úerþ   ÚcountÚtoolÚsplineÚnums        €r1   Úto_spline_edgezCBoundaryPaths.ellipse_edges_to_spline_edges.<locals>.to_spline_edgeq  sÊ   ø€ ô *Ø—x‘xØŸ<™<Ø—g‘gØŸM™MØŸ+™+ôˆGô œœE #›J¨×);Ñ);Ñ;¼d¿h¹hÑFÓGÈÓKˆEÜ×0Ñ0°¸%Ó@ˆDÜ“\ˆFØ ŸK™KˆFŒMØ—5’5Ø—|‘|“~�ä$(§I¡I¨d×.AÑ.AÓ$BˆFÔ!Ø!%§¡£ˆFÔØ!Ÿ\™\›^ˆFŒNØˆMr0   N)r  r!   rV   r"   )r´   rt   rº   r   rí   r!   )rB   r  r  rò   r•   rí   r   r  s    `      r1   Úellipse_edges_to_spline_edgesz+BoundaryPaths.ellipse_edges_to_spline_edgesg  sb   ø€ õ	ô, !*¨$¯*©*Ö 5ÑˆJ˜Ü˜$¤Õ)ØŸ
™
�Ü(1°%Ö(8Ñ$�J Ü! $¬Õ4Ù,:¸4Ó,@˜˜jÒ)ñ )9ñ !6r0   c                óü   ‡— dˆfd„}| j                   D ]f  }t        |t        «      sŒg }|j                  D ];  }t        |t        «      r|j                   ||«      «       Œ+|j                  |«       Œ= ||_        Œh y)z·Convert all spline edges to line edges (approximation).

        Args:
            factor: count of approximation segments = count of control
                points x factor

        c              3  óˆ  •K  — | j                   }t        | j                  «      r>t        | j                  | j                  dz   | j
                  t        |«      r|nd ¬«      }nUt        | j                  «      r+t        j                  | j                  | j                  «      }nt        j                  d«      ‚t        t        |j                  «      d«      dz
  ‰z  }t        |j                  |«      «      }t        |d d |dd  «      D ]5  \  }}t        «       }|j                  |_        |j                  |_        |–— Œ7 y ­w)Nr(   )r  Úorderr  r  z2SplineEdge() without control points or fit points.r3   éÿÿÿÿ)r  rw   r  r   r  r  Ú
fit_pointsÚfrom_fit_pointsr	   ÚDXFStructureErrorr  rë   ÚapproximateÚzipr   Úvec2rÞ   rß   )	Úspline_edger  ÚbsplineÚsegment_countrì   Úv1Úv2r  Úfactors	           €r1   Úto_line_edgesz?BoundaryPaths.spline_edges_to_line_edges.<locals>.to_line_edges—  s  øè ø€ Ø!×)Ñ)ˆGÜ�;×-Ñ-Ô.Ü!Ø#.×#=Ñ#=Ø%×,Ñ,¨qÑ0Ø%×1Ñ1Ü'*¨7¤|™G¸ô	‘ô �[×+Ñ+Ô,Ü!×1Ñ1Ø×*Ñ*¨K×,>Ñ,>ó‘ô ×-Ñ-ØHóð ô !¤ W×%;Ñ%;Ó!<¸aÓ@À1ÑDÈÑNˆMÜ˜G×/Ñ/°Ó>Ó?ˆHÜ˜h s¨˜m¨X°a°b¨\Ö:‘��BÜ“z�ØŸW™W�”
ØŸ7™7�”Ø“
ñ	 ;ùs   ƒD?EN)r"  r"   )rt   rº   r   rí   r"   Úextendr‘   )rB   r'  r(  r•   Ú	new_edgesr  s    `    r1   Úspline_edges_to_line_edgesz(BoundaryPaths.spline_edges_to_line_edgesŽ  si   ø€ õ	ð2 —J”JˆDÜ˜$¤Õ)Ø�	Ø ŸJœJ�DÜ! $¬
Ô3Ø!×(Ñ(©°tÓ)<Õ=à!×(Ñ(¨Õ.ð	 'ð
 '�•
ñ r0   c                óú   ‡— ˆfd„}| j                   D ]f  }t        |t        «      sŒg }|j                  D ];  }t        |t        «      r|j                   ||«      «       Œ+|j                  |«       Œ= ||_        Œh y)zêConvert all ellipse edges to line edges (approximation).

        Args:
            num: count of control points for a **full** ellipse, partial
                ellipses have proportional fewer control points but at least 3.

        c              3  ó:  •K  — t        | j                  | j                  | j                  | j                  | j
                  ¬«      }t        t        t        ‰«      |j                  z  t        j                  z  «      d«      }|j                  |dz   «      }| j                  st        t        |«      «      }t        |j!                  |«      «      }t#        |d d |dd  «      D ]5  \  }}t%        «       }|j&                  |_        |j&                  |_        |–— Œ7 y ­w)Nr  r3   r(   r  )r   rÓ   rý   rü   r  r  r  r;   r[   r  rØ   r	  Úparamsr×   Úreversedrë   rì   r   r   r!  rÞ   rß   )	r  rþ   r$  r.  rì   r%  r&  rç   r  s	           €r1   r(  z@BoundaryPaths.ellipse_edges_to_line_edges.<locals>.to_line_edgesÃ  sä   øè ø€ ä)Ø—{‘{ØŸ?™?Ø—j‘jØ ×,Ñ,ØŸ.™.ôˆGô  ¤¤E¨#£J°×1CÑ1CÑ$CÄdÇhÁhÑ$NÓ OÐQRÓSˆMØ—^‘^ M°AÑ$5Ó6ˆFð —8’8Ü!¤$ v£,Ó/�Ü˜G×,Ñ,¨VÓ4Ó5ˆHÜ˜h s¨˜m¨X°a°b¨\Ö:‘��BÜ“z�ØŸW™W�”
ØŸ7™7�”Ø“
ñ	 ;ùs   ƒDDN)rt   rº   r   rí   r!   r)  r‘   )rB   r  r(  r•   r*  r  s    `    r1   Úellipse_edges_to_line_edgesz)BoundaryPaths.ellipse_edges_to_line_edgesº  si   ø€ ô	ð, —J”JˆDÜ˜$¤Õ)Ø�	Ø ŸJœJ�DÜ! $¬Ô4Ø!×(Ñ(©°tÓ)<Õ=à!×(Ñ(¨Õ.ð	 'ð
 '�•
ñ r0   c                ój   — | j                  d¬«       | j                  «        | j                  |«       y)a"  Convert all bulge, arc and ellipse edges to spline edges
        (approximation).

        Args:
            num: count of control points for a **full** circle/ellipse, partial
                circles/ellipses have proportional fewer control points but at
                least 3.

        TrÈ   N)rÌ   rÍ   r  )rB   r  s     r1   Úall_to_spline_edgesz!BoundaryPaths.all_to_spline_edgesã  s/   € ð 	×#Ñ#°DÐ#Ô9Ø×'Ñ'Ô)Ø×*Ñ*¨3Õ/r0   c                óŒ   — | j                  d¬«       | j                  «        | j                  |«       | j                  |«       y)a¹  Convert all bulge, arc and ellipse edges to spline edges and
        approximate this splines by line edges.

        Args:
            num: count of control points for a **full** circle/ellipse, partial
                circles/ellipses have proportional fewer control points but at
                least 3.
            spline_factor: count of spline approximation segments = count of
                control points x spline_factor

        TrÈ   N)rÌ   rÍ   r0  r+  )rB   r  Úspline_factors      r1   Úall_to_line_edgeszBoundaryPaths.all_to_line_edgesñ  s=   € ð 	×#Ñ#°DÐ#Ô9Ø×'Ñ'Ô)Ø×(Ñ(¨Ô-Ø×'Ñ'¨Õ6r0   c                ó2  — | j                   D ]ˆ  }t        |t        «      r|j                  «       c S t        |t        «      rA|j
                  D ]1  }|j                  t        j                  t        j                  hv sŒ0  y Œvt        t        |«      «      ‚ y)zgReturns ``True`` if any boundary path has bulge values or arc edges
        or ellipse edges.

        TF)rt   rº   r   rñ   r   rí   r:   r#   r6   r7   r»   )rB   r•   r  s      r1   Úhas_critical_elementsz#BoundaryPaths.has_critical_elements  su   € ð
 —J”JˆDÜ˜$¤Ô-Ø—~‘~Ó'Ò'Ü˜D¤(Ô+Ø ŸJœJ�DØ—y‘y¤X§\¡\´8×3CÑ3CÐ$DÒDÚ#ñ 'ô  ¤ T£
Ó+Ð+ð ð r0   r@   )rt   z$Optional[list[AbstractBoundaryPath]]r\   )rF   r
   rV   r   rU   )rV   úIterable[AbstractBoundaryPath])r·   r;   rV   r8  )r•   r&   rV   rW   ©Tr(   ©r¾   zIterable[tuple[float, ...]]r¿   r]   r«   r;   rV   r   )r(   )r«   r;   rV   r   rX   )r   rZ   ©T©é   )rõ   r[   rö   r;   )é    )r  r;   rV   rW   )é   )r'  r;   rV   rW   )é@   )r@  r?  )r  r;   r4  r;   rV   rW   )!r*   r+   r,   ru   rx   r{   r~   rS   ra   rG   rp   r™   rC   r    r¤   r§   r	   rµ   r¸   r‘   rÁ   rÃ   rK   rP   rÌ   rø   rÍ   r  r+  r0  r2  r5  r7  r/   r0   r1   r   r   p   sõ   „ ô=òò ò ó5ð òó ðð  òHó ðHóóóóð "'×!9Ñ!9ðFØðFà	'óFó> ð Øð	à2ðð ðð ð	ð
 
óô&
ó0ô
5ô;<ôzó"=ô(%AôN*'ôX''ôR0ô7ô"r0   r   r   c                óÊ   — dd l }|j                  j                  | t        «       d¬«      }d„ |j	                  ||«      D «       }t
        j                  || j                  ¬«      S )Nr   )rN   rO   c              3  óL   K  — | ]  }|j                   |j                  f–— Œ y ­wr@   )rÜ   rÝ   )r„   Úvs     r1   r†   z+flatten_to_polyline_path.<locals>.<genexpr>  s   è ø€ ÐKÑ$J˜q�—‘�a—c‘c”
Ñ$Jùs   ‚"$rª   )Ú
ezdxf.pathr•   Úfrom_hatch_boundary_pathr   Ú
flatteningr   r½   r<   )r•   rõ   rö   ÚezdxfÚez_pathrì   s         r1   rô   rô     sa   € ó ð �j‰j×1Ñ1°$¼C»EÈQÐ1ÓO€GÙK G×$6Ñ$6°xÀÔ$JÓK€HÜ×%Ñ%ØØ×"Ñ"ð &ó ð r0   c                óú   — g }t        | «      rm| d   j                  dv rM| j                  «       }|j                  dk(  r|j                  |j                  «       n|j                  «        |S 	 g S t        | «      rŒmg S )Nr  )éa   éJ  rK  )rw   r�   Úpopr‘   r�   r  )r“   Úsource_boundary_object_tagsÚlast_tags      r1   Ú pop_source_boundary_objects_tagsrO  !  sv   € Ø"$ÐÜ
ˆiŒ.Ø�R‰=×Ñ Ñ*Ø —}‘}“ˆHØ�}‰} Ò#Ø+×2Ñ2°8·>±>ÕBð ,×3Ñ3Ô5Ø2Ð2àà€Iô ˆi�.ð €Ir0   c                ól   — | j                  dt        |«      «       |D ]  }| j                  d|«       Œ y )NrJ  rK  )rÆ   rw   )rI   ÚhandlesÚhandles      r1   Úexport_source_boundary_objectsrS  2  s2   € ð ×Ñ˜œS ›\Ô*ÛˆØ×Ñ˜S &Õ)ñ r0   c                  ó¢   — e Zd Zej                  Zdd„Zdd„Ze	 	 d	 	 	 	 	 	 	 dd„«       Z	edd„«       Z
	 d	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd	„Zy
)r   c                óX   — t         j                  | _        d| _        g | _        g | _        y )NF)r	   ÚBOUNDARY_PATH_POLYLINEr<   r¿   rì   r>   rA   s    r1   ru   zPolylinePath.__init__=  s*   € Ü$)×$@Ñ$@ˆÔØˆŒð ;=ˆŒð 35ˆÕ$r0   c                 ó   — y©NTr/   rA   s    r1   rS   zPolylinePath.is_validG  ó   € Ør0   c                ón   — t        «       }|j                  ||«       |t        j                  z  |_        |S )aG  Create a new :class:`PolylinePath` object from vertices.

        Args:
            path_vertices: iterable of polyline vertices as (x, y) or
                (x, y, bulge)-tuples.
            is_closed: 1 for a closed polyline else 0
            flags: default(0), external(1), derived(4), textbox(8) or outermost(16)

        )r   Úset_verticesr	   rV  r<   )rE   r¾   r¿   r«   rÀ   s        r1   r½   zPolylinePath.from_verticesJ  s3   € ô   “>ˆØ×Ñ˜m¨YÔ7Ø#(¬5×+GÑ+GÑ#GˆÔ Øˆr0   c                óv  — t        «       }t        |«      |_        |D ]™  }|\  }}|dk(  r%|j                  j	                  |d   |d   df«       Œ2|dk(  r=|j                  j                  «       \  }}}|j                  j	                  |||f«       Œt|dk(  rŒz|dk(  r||_        Œ‡|dk(  r||_        Œ”|d	k(  sŒšŒ› |S )
Né
   r   r(   rÐ   é*   éH   éI   rŒ   é]   )r   rO  r>   rì   r‘   rL  r¿   r<   )	rE   rF   r•   Útagr�   r�   rÜ   rÝ   rã   s	            r1   rG   zPolylinePath.load_tags_  sÀ   € ä‹~ˆÜ'GÈÓ'MˆÔ$ÛˆCØ‰KˆD�%Ø�rŠzà—‘×$Ñ$ e¨A¡h°°a±¸#Ð%>Õ?Ø˜’Ø"Ÿm™m×/Ñ/Ó1‘��1�eà—‘×$Ñ$ a¨¨E ]Õ3Ø˜’ØØ˜’Ø!&�•Ø˜’Ø',�Õ$Ø˜“Øð! ð" ˆr0   c                óÚ   — g }|D ]V  }t        |«      dk(  r|\  }}d}n*t        |«      dk(  r|\  }}}nt        j                  d«      ‚|j                  |||f«       ŒX || _        || _        y)zpSet new `vertices` as new polyline path, a vertex has to be a
        (x, y) or a (x, y, bulge)-tuple.

        r)   rÐ   r3   z7Invalid vertex format, expected (x, y) or (x, y, bulge)N)rw   r	   ÚDXFValueErrorr‘   rì   r¿   )rB   rì   r¿   Únew_verticesÚvertexrÜ   rÝ   rã   s           r1   r[  zPolylinePath.set_verticesv  s€   € ð ˆÛˆFÜ�6‹{˜aÒØ‘��1Ø‘Ü�V“ Ò!Ø$‘��1‘eä×)Ñ)ØMóð ð ×Ñ  A u Õ.ð ð %ˆŒØ"ˆ�r0   c                ó.   — g | _         d| _        g | _        y)zrRemoves all vertices and all handles to associated DXF objects
        (:attr:`source_boundary_objects`).
        FN)rì   r¿   r>   rA   s    r1   rC   zPolylinePath.clearŒ  s   € ð ˆŒØˆŒØ')ˆÕ$r0   c                ó:   — t        d„ | j                  D «       «      S )Nc              3  ó(   K  — | ]
  \  }}}|–— Œ y ­wr@   r/   )r„   rÜ   rÝ   rã   s       r1   r†   z)PolylinePath.has_bulge.<locals>.<genexpr>•  s   è ø€ Ð:©M™[˜Q  5”5©Mùs   ‚)r˜   rì   rA   s    r1   rñ   zPolylinePath.has_bulge”  s   € ÜÑ:¨D¯MªMÓ:Ó:Ð:r0   c                óp  — | j                  «       }|j                  } |dt        | j                  «      «       |dk(  r/ |dt        |«      «        |dt        | j                  «      «       nB|dk(  r/ |dt        | j                  «      «        |dt        |«      «       nt        d|› �«      ‚ |dt        | j                  «      «       | j                  D ]A  \  }}}|j                  dt        |«      t        |«      f«       |sŒ0 |d	t        |«      «       ŒC |dk(  rt        || j                  «       y y )
NrŒ   ÚHATCHr_  r`  ÚMPOLYGONzunsupported DXF type ra  r]  r^  )rñ   rÆ   r;   r<   r¿   Ú
ValueErrorrw   rì   Úwrite_vertexr[   rS  r>   )rB   rI   rJ   rñ   Ú	write_tagrÜ   rÝ   rã   s           r1   rK   zPolylinePath.export_dxf—  s  € Ø—N‘NÓ$ˆ	Ø×(Ñ(ˆ	á�"”c˜$×.Ñ.Ó/Ô0Ø�gÒÙ�bœ#˜i›.Ô)Ù�bœ#˜dŸn™nÓ-Õ.Ø˜
Ò"Ù�bœ#˜dŸn™nÓ-Ô.Ù�bœ#˜i›.Õ)äÐ4°W°IÐ>Ó?Ð?Ù�"”c˜$Ÿ-™-Ó(Ô)ØŸ=œ=‰KˆAˆq�%Ø×"Ñ" 2¬¨a«´%¸³(Ð';Ô<ÚÙ˜"œe E›lÕ+ð )ð
 �gÒÜ*¨9°d×6RÑ6RÕSð r0   c                óz   ‡ ‡‡‡— ‰j                    Šˆˆˆˆ fd„}‰ j                  rt         |«       «      ‰ _        yy)zTransform polyline path.c               3  óÄ   •K  — ‰j                   D ]L  \  } }}|r‰rt        d«      ‚‰j                  t        | |‰«      «      }|j                  |j
                  |f–— ŒN y ­w)Nz<Polyline path with arcs does not support non-uniform scaling)rì   r   Útransform_vertexr   rÜ   rÝ   )rÜ   rÝ   rã   rC  rO   Úhas_non_uniform_scalingrN   rB   s       €€€€r1   Ú
_transformz*PolylinePath.transform.<locals>._transform±  sd   øè ø€ Ø#Ÿ}œ}‘��1�eñ Ñ4Ü0ð"óð ð ×(Ñ(¬¨a°°IÓ)>Ó?�Ø—c‘c˜1Ÿ3™3 �oÓ%ñ  -ùs   ƒAA N)rË   rì   rë   )rB   rN   rO   rt  rs  s   ``` @r1   rP   zPolylinePath.transform­  s3   û€ à&)×&7Ñ&7Ð"7Ð÷
	&ð �=Š=Ü ¡£Ó.ˆD�Mð r0   NrU   r\   r9  r:  )rF   r
   rV   r   r;  )rì   zIterable[Sequence[float]]r¿   r]   rV   rW   rX   rZ   )r*   r+   r,   r$   r-   r:   ru   rS   ra   r½   rG   r[  rC   rñ   rK   rP   r/   r0   r1   r   r   :  s¦   „ Ø×$Ñ$€Dó5óð ð Øð	à2ðð ðð ð	ð
 
òó ðð( òó ðð. FJð#Ø1ð#Ø>Bð#à	ó#ó,*ó;óTô,/r0   c                  ó"  — e Zd Zej                  Zdd„Zd„ Zdd„Ze	dd„«       Z
dd„Zdd„Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd
„Z	 	 d	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zy	)r   c                óJ   — t         j                  | _        g | _        g | _        y r@   )r	   ÚBOUNDARY_PATH_DEFAULTr<   rí   r>   rA   s    r1   ru   zEdgePath.__init__Ä  s   € Ü$×:Ñ:ˆÔØ)+ˆŒ
Ø')ˆÕ$r0   c                ó,   — t        | j                  «      S r@   )r}   rí   rA   s    r1   r~   zEdgePath.__iter__É  r   r0   c                ó:   — t        d„ | j                  D «       «      S )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­wr@   r‚   )r„   r  s     r1   r†   z$EdgePath.is_valid.<locals>.<genexpr>Í  r‡   rˆ   )r‰   rí   rA   s    r1   rS   zEdgePath.is_validÌ  rŠ   r0   c                ó  —  | «       }t        |«      |_        t        |d¬«      D ]c  }t        |«      dk(  rŒ|d   j                  }d|cxk  rdk  sŒ-n Œ0|j
                  j                  t        |   j                  |dd  «      «       Œe |S )Nr_  r�   r   é   r(   )	rO  r>   r   rw   r�   rí   r‘   ÚEDGE_CLASSESrG   )rE   rF   rï   Ú	edge_tagsÚ	edge_types        r1   rG   zEdgePath.load_tagsÏ  s„   € á“Eˆ	Ü,LÈTÓ,Rˆ	Ô)Ü# D°B×7ˆIÜ�9‹~ Ò"ØØ! !™×*Ñ*ˆIØ�9Ô ˜qÖ Ø—‘×&Ñ&¤|°IÑ'>×'HÑ'HÈÐSTÐSUÈÓ'WÕXð 8ð Ðr0   c                óL   — | j                   D ]  }|j                  ||¬«       Œ y)zTransform edge boundary paths.rÊ   N)rí   rP   )rB   rN   rO   r  s       r1   rP   zEdgePath.transformÛ  s    € à—J”JˆDØ�N‰N˜3¨)ˆNÕ4ñ r0   c                ó�   — t        «       }t        |«      |_        t        |«      |_        | j                  j                  |«       |S )z­Add a :class:`LineEdge` from `start` to `end`.

        Args:
            start: start point of line, (x, y)-tuple
            end: end point of line, (x, y)-tuple

        )r   r   rÞ   rß   rí   r‘   )rB   rÞ   rß   rç   s       r1   Úadd_linezEdgePath.add_lineà  s8   € ô ‹zˆÜ˜%“[ˆŒ
Ü˜“9ˆŒØ�
‰
×Ñ˜$ÔØˆr0   c                óº   — t        «       }t        |«      |_        ||_        ||_        ||_        t        |«      |_        | j                  j                  |«       |S )ac  Add an :class:`ArcEdge`.

        **Adding Clockwise Oriented Arcs:**

        Clockwise oriented :class:`ArcEdge` objects are sometimes necessary to
        build closed loops, but the :class:`ArcEdge` objects are always
        represented in counter-clockwise orientation.
        To add a clockwise oriented :class:`ArcEdge` you have to swap the
        start- and end angle and set the `ccw` flag to ``False``,
        e.g. to add a clockwise oriented :class:`ArcEdge` from 180 to 90 degree,
        add the :class:`ArcEdge` in counter-clockwise orientation with swapped
        angles::

            edge_path.add_arc(center, radius, start_angle=90, end_angle=180, ccw=False)

        Args:
            center: center point of arc, (x, y)-tuple
            radius: radius of circle
            start_angle: start angle of arc in degrees (`end_angle` for a
                clockwise oriented arc)
            end_angle: end angle of arc in degrees (`start_angle` for a
                clockwise oriented arc)
            ccw: ``True`` for counter-clockwise ``False`` for
                clockwise orientation

        )
r    r   rÓ   rÔ   rÚ   rÛ   r]   r×   rí   r‘   )rB   rÓ   rÔ   rÚ   rÛ   r×   rå   s          r1   Úadd_arczEdgePath.add_arcî  sP   € ôD ‹iˆÜ˜&“\ˆŒ
ØˆŒ
à%ˆŒØ!ˆŒô �s“)ˆŒØ�
‰
×Ñ˜#ÔØˆ
r0   c                ó  — |dkD  rt        j                  d«      ‚t        «       }t        |«      |_        t        |«      |_        ||_        ||_        ||_        t        |«      |_
        | j                  j                  |«       |S )aø  Add an :class:`EllipseEdge`.

        **Adding Clockwise Oriented Ellipses:**

        Clockwise oriented :class:`EllipseEdge` objects are sometimes necessary
        to build closed loops, but the :class:`EllipseEdge` objects are always
        represented in counter-clockwise orientation.
        To add a clockwise oriented :class:`EllipseEdge` you have to swap the
        start- and end angle and set the `ccw` flag to ``False``,
        e.g. to add a clockwise oriented :class:`EllipseEdge` from 180 to 90
        degree, add the :class:`EllipseEdge` in counter-clockwise orientation
        with swapped angles::

            edge_path.add_ellipse(center, major_axis, ratio, start_angle=90, end_angle=180, ccw=False)

        Args:
            center: center point of ellipse, (x, y)-tuple
            major_axis: vector of major axis as (x, y)-tuple
            ratio: ratio of minor axis to major axis as float
            start_angle: start angle of ellipse in degrees (`end_angle` for a
                clockwise oriented ellipse)
            end_angle: end angle of ellipse in degrees (`start_angle` for a
                clockwise oriented ellipse)
            ccw: ``True`` for counter-clockwise ``False`` for
                clockwise orientation

        rû   z!argument 'ratio' has to be <= 1.0)r	   rd  r!   r   rÓ   rý   rü   rÚ   rÛ   r]   r×   rí   r‘   )rB   rÓ   rý   rü   rÚ   rÛ   r×   rþ   s           r1   Úadd_ellipsezEdgePath.add_ellipse  sz   € ðJ �3Š;Ü×%Ñ%Ð&IÓJÐJÜ“-ˆÜ˜f›ˆŒÜ! *Ó-ˆÔØˆŒð *ˆÔØ%ˆÔô ˜3“iˆŒØ�
‰
×Ñ˜'Ô"Øˆr0   Nc	                ó8  — t        «       }	|�t        j                  |«      |	_        |�t        j                  |«      |	_        |�t        |«      |	_        n0t        t        t        |	j                  «      |dz   «      «      |	_        |�t        |«      |	_        ||	_	        t        t        t        |	j                  «      «      «      |	_        t        |«      |	_        |�t        |«      |	_        |�t        |«      |	_        | j                   j#                  |	«       |	S )aì  Add a :class:`SplineEdge`.

        Args:
            fit_points: points through which the spline must go, at least 3 fit
                points are required. list of (x, y)-tuples
            control_points: affects the shape of the spline, mandatory and
                AutoCAD crashes on invalid data. list of (x, y)-tuples
            knot_values: (knot vector) mandatory and AutoCAD crashes on invalid
                data. list of floats; `ezdxf` provides two tool functions to
                calculate valid knot values: :func:`ezdxf.math.uniform_knot_vector`,
                :func:`ezdxf.math.open_uniform_knot_vector` (default if ``None``)
            weights: weight of control point, not mandatory, list of floats.
            degree: degree of spline (int)
            periodic: 1 for periodic spline, 0 for none periodic spline
            start_tangent: start_tangent as 2d vector, optional
            end_tangent: end_tangent as 2d vector, optional

        .. warning::

            Unlike for the spline entity AutoCAD does not calculate the
            necessary `knot_values` for the spline edge itself. On the contrary,
            if the `knot_values` in the spline edge are missing or invalid
            AutoCAD **crashes**.

        r(   )r"   r   rë   r  r  r  r   rw   r  r  r;   r]   ÚrationalÚperiodicÚstart_tangentÚend_tangentrí   r‘   )
rB   r  r  r  r  r  r‰  rŠ  r‹  r  s
             r1   Ú
add_splinezEdgePath.add_splineQ  sï   € ôH “ˆØÐ!Ü $§	¡	¨*Ó 5ˆFÔØÐ%Ü$(§I¡I¨nÓ$=ˆFÔ!ØÐ"Ü!% kÓ!2ˆFÕä!%Ü(¬¨V×-BÑ-BÓ)CÀVÈaÁZÓPó"ˆFÔð ÐÜ! '›]ˆFŒNØˆŒÜœd¤3 v§~¡~Ó#6Ó7Ó8ˆŒÜ˜h›-ˆŒØÐ$Ü#'¨Ó#6ˆFÔ ØÐ"Ü!% kÓ!2ˆFÔØ�
‰
×Ñ˜&Ô!Øˆr0   c                óv   — t        |||¬«      }| j                  ||j                  |j                  «       ¬«      S )N)r  r  Úmethod)r  r  r  )r   rŒ  r  r  )rB   r  r  rŽ  r#  s        r1   Úadd_spline_control_framez!EdgePath.add_spline_control_frameŒ  sB   € ô /Ø!¨&¸ô
ˆð �‰Ø!Ø"×1Ñ1ØŸ™›ð ó 
ð 	
r0   c                ó   — g | _         y)zDelete all edges.N)rí   rA   s    r1   rC   zEdgePath.clear›  r›   r0   c                ó  — |j                  dt        | j                  «      «       |j                  dt        | j                  «      «       | j                  D ]  }|j                  |«       Œ t        || j                  «       y )NrŒ   ra  )rÆ   r;   r<   rw   rí   rK   rS  r>   )rB   rI   rJ   r  s       r1   rK   zEdgePath.export_dxfŸ  s_   € Ø×Ñ˜R¤ T×%9Ñ%9Ó!:Ô;Ø×Ñ˜R¤ T§Z¡Z£Ô1Ø—J”JˆDØ�O‰O˜IÕ&ð ä& y°$×2NÑ2NÕOr0   c                ó²  — t        | j                  «      dk  ryt        | j                  «      }|j                  d«      }|j	                  |«       |g}|j
                  }|D ]l  }|j                  }|j                  |«      |kD  r)t        «       }||_	        ||_
        |j	                  |«       ||ur|j	                  |«       |j
                  }Œn || _        y)z—Insert line-edges between the existing edges if the gap between these edges
        are bigger than `len_tol`.

        .. versionadded:: 1.4

        r)   Nr   )rw   rí   rë   rL  r‘   rm   rk   rõ   r   rÞ   rß   )	rB   Úlen_tolÚcurrent_edgesÚ
first_edger*  rf   r  rd   Ú	line_edges	            r1   Ú
close_gapszEdgePath.close_gaps¦  sÊ   € ô ˆt�z‰z‹?˜QÒØÜ˜TŸZ™ZÓ(ˆØ"×&Ñ& qÓ)ˆ
Ø×Ñ˜ZÔ(à)3¨ˆ	Ø×-Ñ-ˆ	Û!ˆDØ×/Ñ/ˆKØ×!Ñ! +Ó.°Ò8Ü$›J�	Ø"+�	”Ø +�	”Ø× Ñ  Ô+Ø˜:Ñ%Ø× Ñ  Ô&Ø×+Ñ+‰Ið "ð ˆ�
r0   rU   r\   )rF   r
   rV   r   rZ   )rÞ   r   rß   r   rV   r   )rû   rÐ   rÒ   T)rÓ   r   rÔ   r[   rÚ   r[   rÛ   r[   r×   r]   rV   r    )©rû   rÐ   rû   rÐ   rÒ   T)rÓ   r   rý   r   rü   r[   rÚ   r[   rÛ   r[   r×   r]   rV   r!   )NNNNr3   r   NN)r  úOptional[Iterable[UVec]]r  r™  r  úOptional[Iterable[float]]r  rš  r  r;   r‰  r;   rŠ  úOptional[UVec]r‹  r›  rV   r"   )r3   rõ   )r  zIterable[tuple[float, float]]r  r;   rŽ  rY   rV   r"   rX   )r“  r[   rV   rW   )r*   r+   r,   r$   r.   r:   ru   r~   rS   ra   rG   rP   r‚  r„  r†  rŒ  r�  rC   rK   r—  r/   r0   r1   r   r   Á  sž  „ Ø× Ñ €Dó*ò
 ó5ð ò	ó ð	ó5ó
ð" Ø Ø Øð,àð,ð ð,ð ð	,ð
 ð,ð ð,ð 
ó,ðb &ØØ Ø Øð3àð3ð ð3ð ð	3ð
 ð3ð ð3ð ð3ð 
ó3ðn 04Ø37Ø15Ø-1ØØØ(,Ø&*ð9à,ð9ð 1ð9ð /ð	9ð
 +ð9ð ð9ð ð9ð &ð9ð $ð9ð 
ó9ð| Ø ð	
à1ð
ð ð
ð ð	
ð
 
ó
óóPôr0   r   c                  ó|   — e Zd Zd Zej
                  Zd„ Zd	d„Ze	d
d„«       Z
e	d
d„«       Zedd„«       Zdd„Zdd„Zy)r   c                óH   — t        dd«      | _        t        dd«      | _        y rê   ©r   rÞ   rß   rA   s    r1   ru   zLineEdge.__init__Æ  s   € Ü˜!˜Q“ZˆŒ
Ü˜˜1“:ˆ�r0   c                 ó   — yrX  r/   rA   s    r1   rS   zLineEdge.is_validÊ  rY  r0   c                ó   — | j                   S r@   )rÞ   rA   s    r1   rd   zLineEdge.start_pointÍ  s   € à�z‰zÐr0   c                ó   — | j                   S r@   )rß   rA   s    r1   rf   zLineEdge.end_pointÑ  s   € à�x‰xˆr0   c                ó„   —  | «       }|D ]3  }|\  }}|dk(  rt        |«      |_        Œ|dk(  sŒ$t        |«      |_        Œ5 |S )Nr]  é   rž  ©rE   rF   r  rb  r�   r�   s         r1   rG   zLineEdge.load_tagsÕ  sG   € á‹uˆÛˆCØ‰KˆD�%Ø�rŠzÜ! %›[�•
Ø˜“Ü ›;�•ð ð ˆr0   c                ó<  — |j                  dd«       | j                  ^}}}|j                  dt        |«      «       |j                  dt        |«      «       | j                  ^}}}|j                  dt        |«      «       |j                  dt        |«      «       y )Nr_  r(   r]  é   r£  é   )rÆ   rÞ   r[   rß   )rB   rI   rÜ   rÝ   r±   s        r1   rK   zLineEdge.export_dxfà  s€   € Ø×Ñ˜R Ô#à—:‘:ˆˆˆ1ˆqØ×Ñ˜R¤ q£Ô*Ø×Ñ˜R¤ q£Ô*à—8‘8ˆˆˆ1ˆqØ×Ñ˜R¤ q£Ô*Ø×Ñ˜R¤ q£Õ*r0   c                óˆ   — |j                  | j                  |«      | _        |j                  | j                  |«      | _        y r@   )Útransform_2d_vertexrÞ   rß   rM   s      r1   rP   zLineEdge.transformë  s2   € Ø×,Ñ,¨T¯Z©Z¸ÓCˆŒ
Ø×*Ñ*¨4¯8©8°YÓ?ˆ�r0   Nr\   rn   )rF   r
   rV   r   ro   rZ   )r*   r+   r,   Ú	EDGE_TYPEr#   r5   r:   ru   rS   rp   rd   rf   ra   rG   rK   rP   r/   r0   r1   r   r   Â  sa   „ Ø€IØ�=‰=€Dòóð òó ðð òó ðð òó ðó	+ô@r0   r   c                  óª   — e Zd Zej                  Zd Zdd„Zdd„Ze	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y)r    c                ó^   — t        dd«      | _        d| _        d| _        d| _        d| _        y )NrÐ   rû   rÒ   T)r   rÓ   rÔ   rÚ   rÛ   r×   rA   s    r1   ru   zArcEdge.__init__ô  s,   € Ü˜3 “nˆŒØ ˆŒà"%ˆÔØ %ˆŒàˆ�r0   c                 ó   — yrX  r/   rA   s    r1   rS   zArcEdge.is_validý  rY  r0   c                ó6   — | j                  «       j                  S r@   )Úconstruction_toolrd   rA   s    r1   rd   zArcEdge.start_point   s   € à×%Ñ%Ó'×3Ñ3Ð3r0   c                óJ   — | j                   r| j                  S | j                  S r@   ©r×   rd   rf   rA   s    r1   rk   zArcEdge.real_start_point  ó   € à�8Š8Ø×#Ñ#Ð#Ø�~‰~Ðr0   c                ó6   — | j                  «       j                  S r@   )r¯  rf   rA   s    r1   rf   zArcEdge.end_point
  s   € à×%Ñ%Ó'×1Ñ1Ð1r0   c                óJ   — | j                   r| j                  S | j                  S r@   ©r×   rf   rd   rA   s    r1   rm   zArcEdge.real_end_point  ó   € à�8Š8Ø—>‘>Ð!Ø×ÑÐr0   c                ó&  —  | «       }d}d}|D ]P  }|\  }}|dk(  rt        |«      |_        Œ|dk(  r||_        Œ+|dk(  r|}Œ3|dk(  r|}Œ;|dk(  sŒAt        |«      |_        ŒR |j                  r||_        ||_        |S d|z
  |_        d|z
  |_        |S )NrÐ   r]  é(   é2   é3   r`  rÒ   )r   rÓ   rÔ   r]   r×   rÚ   rÛ   ©rE   rF   r  rÞ   rß   rb  r�   r�   s           r1   rG   zArcEdge.load_tags  s­   € á‹uˆØˆØˆÛˆCØ‰KˆD�%Ø�rŠzÜ" 5›k�•Ø˜’Ø#�•Ø˜’Ø‘Ø˜’Ø‘Ø˜“Ü ›;�•ð ð( �8Š8Ø$ˆDÔØ ˆDŒNð ˆð  % s™{ˆDÔØ" U™]ˆDŒNØˆr0   c                ó  — |j                  dd«       | j                  ^}}}| j                  r| j                  }| j                  }nd| j                  z
  }d| j                  z
  }|j                  dt        |«      «       |j                  dt        |«      «       |j                  d| j                  «       |j                  d|«       |j                  d|«       |j                  d	t        | j                  «      «       y )
Nr_  r)   rÒ   r]  r¦  r¸  r¹  rº  r`  )rÆ   rÓ   r×   rÚ   rÛ   r[   rÔ   r;   ©rB   rI   rÜ   rÝ   r±   rÞ   rß   s          r1   rK   zArcEdge.export_dxf5  sÐ   € Ø×Ñ˜R Ô#Ø—;‘;ˆˆˆ1ˆqØ�8Š8Ø×$Ñ$ˆEØ—.‘.‰Cð ˜DŸN™NÑ*ˆEØ˜$×*Ñ*Ñ*ˆCØ×Ñ˜R¤ q£Ô*Ø×Ñ˜R¤ q£Ô*Ø×Ñ˜R §¡Ô-Ø×Ñ˜R Ô'Ø×Ñ˜R Ô%Ø×Ñ˜R¤ T§X¡X£Õ/r0   c                óî  — |j                  | j                  |«      | _        |j                  t        | j                  dd«      «      | _        t        j                  t        | j                  | j                  «      d«      sA|j                  | j                  «      | _        |j                  | j                  «      | _	        y |j                  | j                  «      | _        | j                  dz   | _	        y )Nr   rÒ   )r©  rÓ   Útransform_lengthr   rÔ   rØ   rÖ   r   rÚ   rÛ   Útransform_deg_anglerM   s      r1   rP   zArcEdge.transformG  s¹   € Ø×-Ñ-¨d¯k©k¸9ÓEˆŒØ×*Ñ*¬4°·±¸QÀÓ+BÓCˆŒÜ�|‰|Ü˜t×/Ñ/°·±Ó@À%ô
ð  #×6Ñ6°t×7GÑ7GÓHˆDÔØ ×4Ñ4°T·^±^ÓDˆD�Nð  #×6Ñ6°t×7GÑ7GÓHˆDÔà!×-Ñ-°Ñ5ˆD�Nr0   c                óp   — t        | j                  | j                  | j                  | j                  ¬«      S )z5Returns ConstructionArc() for the OCS representation.)rÓ   rÔ   rÚ   rÛ   )r   rÓ   rÔ   rÚ   rÛ   rA   s    r1   r¯  zArcEdge.construction_tool\  s-   € äØ—;‘;Ø—;‘;Ø×(Ñ(Ø—n‘nô	
ð 	
r0   NrU   r\   rn   )rF   r
   rV   r    ro   rZ   )rV   r   )r*   r+   r,   r#   r6   r:   rª  ru   rS   rp   rd   rk   rf   rm   ra   rG   rK   rP   r¯  r/   r0   r1   r    r    ð  sŽ   „ Ø�<‰<€DØ€Ióóð ò4ó ð4ð òó ðð
 ò2ó ð2ð ò ó ð ð
 òó ðó@0ó$6ô*
r0   r    c                  ó  — e Zd Zd Zej
                  Zdd„Zdd„Ze	dd„«       Z
e	dd„«       Ze	dd„«       Ze	dd„«       Ze	dd„«       Zej                  dd„«       Ze	dd	„«       Zej                  dd
„«       Zedd„«       Zdd„Zdd„Zdd„Zy)r!   c                ó|   — t        d«      | _        t        d«      | _        d| _        d| _        d| _        d| _        y )N)rÐ   rÐ   r˜  rû   rÐ   rÒ   T)r   rÓ   rý   rü   rÚ   rÛ   r×   rA   s    r1   ru   zEllipseEdge.__init__j  s7   € Ü˜:Ó&ˆŒä˜zÓ*ˆŒØˆŒ
à"%ˆÔØ %ˆŒàˆ�r0   c                 ó   — yrX  r/   rA   s    r1   rS   zEllipseEdge.is_validu  rY  r0   c                óJ   — | j                  «       j                  j                  S r@   )r¯  rd   r!  rA   s    r1   rd   zEllipseEdge.start_pointx  s   € à×%Ñ%Ó'×3Ñ3×8Ñ8Ð8r0   c                óJ   — | j                  «       j                  j                  S r@   )r¯  rf   r!  rA   s    r1   rf   zEllipseEdge.end_point|  s   € à×%Ñ%Ó'×1Ñ1×6Ñ6Ð6r0   c                óJ   — | j                   r| j                  S | j                  S r@   r±  rA   s    r1   rk   zEllipseEdge.real_start_point€  r²  r0   c                óJ   — | j                   r| j                  S | j                  S r@   rµ  rA   s    r1   rm   zEllipseEdge.real_end_point†  r¶  r0   c                óh   — t        | j                  t        j                  | j                  «      «      S r@   )r   rü   rØ   ÚradiansrÚ   rA   s    r1   r  zEllipseEdge.start_paramŒ  s"   € ä˜dŸj™j¬$¯,©,°t×7GÑ7GÓ*HÓIÐIr0   c                ó`   — t        j                  t        | j                  |«      «      | _        y r@   )rØ   rÙ   r   rü   rÚ   ©rB   Úparams     r1   r  zEllipseEdge.start_param�  s   € äŸ<™<¬°t·z±zÀ5Ó(IÓJˆÕr0   c                óh   — t        | j                  t        j                  | j                  «      «      S r@   )r   rü   rØ   rÊ  rÛ   rA   s    r1   r  zEllipseEdge.end_param”  s    € ä˜dŸj™j¬$¯,©,°t·~±~Ó*FÓGÐGr0   c                ó`   — t        j                  t        | j                  |«      «      | _        y r@   )rØ   rÙ   r   rü   rÛ   rÌ  s     r1   r  zEllipseEdge.end_param˜  s   € äŸ™¤n°T·Z±ZÀÓ&GÓHˆ�r0   c                óR  —  | «       }d}d}|D ]f  }|\  }}|dk(  rt        |«      |_        Œ|dk(  rt        |«      |_        Œ4|dk(  r||_        ŒA|dk(  r|}ŒI|dk(  r|}ŒQ|dk(  sŒWt	        |«      |_        Œh |j
                  r||_        ||_        |S d|z
  |_        d|z
  |_        |S )	NrÐ   r]  r£  r¸  r¹  rº  r`  rÒ   )r   rÓ   rý   rü   r]   r×   rÚ   rÛ   r»  s           r1   rG   zEllipseEdge.load_tagsœ  s¿   € á‹uˆØˆØˆÛˆCØ‰KˆD�%Ø�rŠzÜ" 5›k�•Ø˜’Ü"& u£+�•Ø˜’Ø"�•
Ø˜’Ø‘Ø˜’Ø‘Ø˜“Ü ›;�•ð ð �8Š8Ø$ˆDÔØ ˆDŒNð ˆð  % s™{ˆDÔØ" U™]ˆDŒNàˆr0   c                óŒ  — |j                  dd«       | j                  ^}}}|j                  dt        |«      «       |j                  dt        |«      «       | j                  ^}}}|j                  dt        |«      «       |j                  dt        |«      «       |j                  d| j                  «       | j
                  r| j                  }| j                  }nd| j                  z
  }d| j                  z
  }|j                  d	|«       |j                  d
|«       |j                  dt        | j
                  «      «       y )Nr_  r3   r]  r¦  r£  r§  r¸  rÒ   r¹  rº  r`  )	rÆ   rÓ   r[   rý   rü   r×   rÚ   rÛ   r;   r½  s          r1   rK   zEllipseEdge.export_dxfÀ  s  € Ø×Ñ˜R Ô#Ø—;‘;ˆˆˆ1ˆqØ×Ñ˜R¤ q£Ô*Ø×Ñ˜R¤ q£Ô*Ø—?‘?ˆˆˆ1ˆqØ×Ñ˜R¤ q£Ô*Ø×Ñ˜R¤ q£Ô*Ø×Ñ˜R §¡Ô,Ø�8Š8Ø×$Ñ$ˆEØ—.‘.‰Cð ˜DŸN™NÑ*ˆEØ˜$×*Ñ*Ñ*ˆCà×Ñ˜R Ô'Ø×Ñ˜R Ô%Ø×Ñ˜R¤ T§X¡X£Õ/r0   c           	     óÂ   — t        t        | j                  «      t        | j                  «      t        ddd«      | j                  | j
                  | j                  ¬«      S )z9Returns ConstructionEllipse() for the OCS representation.r   r(   )rÓ   rý   Ú	extrusionrü   r  r  )r   r   rÓ   rý   rü   r  r  rA   s    r1   r¯  zEllipseEdge.construction_toolÖ  sK   € ä"Ü˜Ÿ™Ó$Ü˜DŸO™OÓ,Ü˜1˜a “mØ—*‘*ð ×(Ñ(Ø—n‘nô	
ð 		
r0   c                óÚ  — | j                  «       }|j                  j                  } ||j                  j	                  |¬«      «      |_         ||j
                  «      |_        |j                  |_        |j                  |j                  «       |j                  j                  } ||j                  «      j                  | _         ||j
                  «      j                  | _        |j                  | _        |j                  | _        |j                  | _        | j                   dz  | _        | j"                  dz  | _        t%        j&                  | j"                  d«      rd| _        y y )N©ÚzrÒ   r   )r¯  Úold_ocsÚto_wcsrÓ   Úreplacerý   Úold_extrusionrÓ  rP   ÚmÚnew_ocsÚfrom_wcsr!  rü   r  r  rÚ   rÛ   rØ   rÖ   )rB   rN   rO   r  Ú
ocs_to_wcsÚ
wcs_to_ocss         r1   rP   zEllipseEdge.transformã  s  € Ø×"Ñ"Ó$ˆð —[‘[×'Ñ'ˆ
Ù˜aŸh™h×.Ñ.°Ð.Ó;Ó<ˆŒÙ! !§,¡,Ó/ˆŒØ×'Ñ'ˆŒð 	
�‰�C—E‘EÔð —[‘[×)Ñ)ˆ
Ù  §¡Ó*×/Ñ/ˆŒÙ$ Q§\¡\Ó2×7Ñ7ˆŒØ—W‘WˆŒ
ð Ÿ=™=ˆÔØŸ™ˆŒð  ×+Ñ+¨eÑ3ˆÔØŸ™¨%Ñ/ˆŒÜ�<‰<˜Ÿ™¨Ô*Ø"ˆD�Nð +r0   NrU   r\   rn   )rV   r[   )rÍ  r[   rV   rW   )rF   r
   rV   r!   ro   )rV   r   rZ   )r*   r+   r,   rª  r#   r7   r:   ru   rS   rp   rd   rf   rk   rm   r  Úsetterr  ra   rG   rK   r¯  rP   r/   r0   r1   r!   r!   f  sô   „ Ø€IØ×Ñ€Dó	óð ò9ó ð9ð ò7ó ð7ð òó ðð
 ò ó ð ð
 òJó ðJð ×ÑòKó ðKð òHó ðHð ×ÑòIó ðIð ò!ó ð!óF0ó,
ô##r0   r!   c                  ó†   — e Zd Zd Zej
                  Zd
d„Zdd„Ze	dd„«       Z
e	dd„«       Zedd„«       Zdd„Zdd„Zdd„Zy	)r"   c                ó‚   — d| _         d| _        d| _        g | _        g | _        g | _        g | _        d | _        d | _        y )Nr3   r   )	r  rˆ  r‰  r  r  r  r  rŠ  r‹  rA   s    r1   ru   zSplineEdge.__init__  sE   € ØˆŒØˆŒØˆŒØ(*ˆÔØ*,ˆÔØ&(ˆŒØ$&ˆŒà-1ˆÔØ+/ˆÕr0   c                óò   — t        | j                  «      rI| j                  dz   }t        | j                  «      }||kD  ry||z   }t        | j                  «      |k7  ryyt        | j                  «      dk  ryy)Nr(   Fr)   T)rw   r  r  r  r  )rB   r  r  Úrequired_knot_counts       r1   rS   zSplineEdge.is_valid  sv   € Üˆt×"Ñ"Ô#Ø—K‘K !‘OˆEÜ˜×+Ñ+Ó,ˆEØ�uŠ}ØØ"'¨%¡-ÐÜ�4×#Ñ#Ó$Ð(;Ò;Øð ô �—‘Ó! AÒ%ØØr0   c                ó    — | j                   d   S rê   ©r  rA   s    r1   rd   zSplineEdge.start_point&  s   € à×"Ñ" 1Ñ%Ð%r0   c                ó    — | j                   d   S )Nr  ræ  rA   s    r1   rf   zSplineEdge.end_point*  s   € à×"Ñ" 2Ñ&Ð&r0   c                óþ  —  | «       }|D ]ð  }|\  }}|dk(  r||_         Œ|dk(  r||_        Œ"|dk(  r||_        Œ/|dk(  r|j                  j	                  |«       ŒP|dk(  r|j
                  j	                  |«       Œq|dk(  r%|j                  j	                  t        |«      «       Œ›|dk(  r%|j                  j	                  t        |«      «       ŒÅ|dk(  rt        |«      |_	        ŒÛ|d	k(  sŒát        |«      |_
        Œò |S )
Né^   r`  éJ   r¸  r^  r]  r£  é   é   )r  rˆ  r‰  r  r‘   r  r  r   r  rŠ  r‹  r¤  s         r1   rG   zSplineEdge.load_tags.  sã   € á‹uˆÛˆCØ‰KˆD�%Ø�rŠzØ#�•Ø˜’Ø %�•Ø˜’Ø %�•Ø˜’Ø× Ñ ×'Ñ'¨Õ.Ø˜’Ø—‘×#Ñ# EÕ*Ø˜’Ø×#Ñ#×*Ñ*¬4°«;Õ7Ø˜’Ø—‘×&Ñ&¤t¨E£{Õ3Ø˜’Ü%)¨%£[�Õ"Ø˜“Ü#'¨£;�Õ ð' ð( ˆr0   c                óp  ‡ — dˆ fd„}t        ‰ j                  «      rHt        ‰ j                  «      t        ‰ j                  «      k(  rd‰ _        nt	        j
                  d«      ‚d‰ _        |j                  } |dd«        |dt        ‰ j                  «      «        |dt        ‰ j                  «      «        |d	t        ‰ j                  «      «        |d
t        ‰ j                  «      «        |dt        ‰ j                  «      «       t        ‰ j                  «      r$‰ j                  D ]  } |dt        |«      «       Œ nt	        j
                  d«      ‚t        j                  ‰ j                  «      }‰ j                  rit        |‰ j                  «      D ]O  \  }} |dt        |j                  «      «        |dt        |j                   «      «        |dt        |«      «       ŒQ n.|D ])  \  }}	 |dt        |«      «        |dt        |	«      «       Œ+ t        ‰ j"                  «      dkD  r] ||«        |dt        ‰ j"                  «      «       ‰ j"                  D ])  ^}}	}
 |dt        |«      «        |dt        |	«      «       Œ+ n&|j$                  t        j&                  k\  r	 |dd«       ‰ j(                  �3‰ j(                  ^}}	}
 |dt        |«      «        |dt        |	«      «       ‰ j*                  �4‰ j*                  ^}}	}
 |dt        |«      «        |dt        |	«      «       y y )Nc                ó–   •— t        | «      dkD  r:‰j                  €| d   | d   z
  ‰_        ‰j                  €| d   | d   z
  ‰_        y y y )Nr(   r   r  éþÿÿÿ)rw   rŠ  r‹  )rà   rB   s    €r1   Úset_required_tangentsz4SplineEdge.export_dxf.<locals>.set_required_tangentsH  sZ   ø€ Ü�6‹{˜QŠØ×%Ñ%Ð-Ø)/°©°V¸A±YÑ)>�DÔ&Ø×#Ñ#Ð+Ø'-¨b¡z°F¸2±JÑ'>�DÕ$ð ,ð r0   r(   zASplineEdge: count of control points and count of weights mismatchr   r_  r4   ré  r`  rê  é_   é`   r¸  z(SplineEdge: missing required knot valuesr]  r¦  r^  rJ  r£  r§  rë  é   rì  é   )rà   z
list[Vec2])rw   r  r  rˆ  r	   rd  rÆ   r;   r  r‰  r  r[   r   rë   r   rÜ   rÝ   r  Ú
dxfversionÚDXF2010rŠ  r‹  )rB   rI   rð  ro  r�   Úcprä   ÚweightrÜ   rÝ   r±   s   `          r1   rK   zSplineEdge.export_dxfG  s›  ø€ õ	?ô ˆt�|‰|ÔÜ�4—<‘<Ó ¤C¨×(;Ñ(;Ó$<Ò<Ø !�•ä×)Ñ)ðóð ð
 ˆDŒMà×(Ñ(ˆ	Ù�"�aÔÙ�"”c˜$Ÿ+™+Ó&Ô'Ù�"”c˜$Ÿ-™-Ó(Ô)Ù�"”c˜$Ÿ-™-Ó(Ô)Ù�"”c˜$×*Ñ*Ó+Ô,Ù�"”c˜$×-Ñ-Ó.Ô/ô ˆt×ÑÔ Ø×)Ô)�Ù˜"œe E›lÕ+ñ *ô ×%Ñ%Ð&PÓQÐQô �Y‰Y�t×*Ñ*Ó+ˆØ�=Š=Ü!$ R¨¯©Ö!6‘��vÙ˜"œe E§G¡G›nÔ-Ù˜"œe E§G¡G›nÔ-Ù˜"œe F›mÕ,ñ "7ó
 ‘��1Ù˜"œe A›hÔ'Ù˜"œe A›hÕ'ð ô
 ˆt�‰Ó !Ò#Ù! "Ô%Ù�bœ#˜dŸo™oÓ.Ô/Ø ŸOœO���1�qÙ˜"œe A›hÔ'Ù˜"œe A›hÕ'ñ ,ð ×!Ñ!¤U§]¡]Ò2á�b˜!Ôà×ÑÐ)Ø×)Ñ)ˆHˆAˆq�1Ù�bœ% ›(Ô#Ù�bœ% ›(Ô#à×ÑÐ'Ø×'Ñ'ˆHˆAˆq�1Ù�bœ% ›(Ô#Ù�bœ% ›(Õ#ð (r0   c                óÞ  ‡‡— t        ˆˆfd„| j                  D «       «      | _        t        ˆˆfd„| j                  D «       «      | _        | j                  �Et	        | j                  «      j                  ‰¬«      }‰j                  |«      j                  | _        | j                  �Ft	        | j                  «      j                  ‰¬«      }‰j                  |«      j                  | _        y y )Nc              3  óB   •K  — | ]  }‰j                  |‰«      –— Œ y ­wr@   ©r©  ©r„   rC  rO   rN   s     €€r1   r†   z'SplineEdge.transform.<locals>.<genexpr>Œ  s#   øè ø€ ð #
Ù;N°aˆC×#Ñ# A y×1Ñ;Nùó   ƒc              3  óB   •K  — | ]  }‰j                  |‰«      –— Œ y ­wr@   rû  rü  s     €€r1   r†   z'SplineEdge.transform.<locals>.<genexpr>�  s"   øè ø€ ð 
Ù;J°aˆC×#Ñ# A y×1¹?ùrý  rÕ  )	rë   r  r  rŠ  r   rÙ  Útransform_directionr!  r‹  )rB   rN   rO   Úts    `` r1   rP   zSplineEdge.transform‹  sÏ   ù€ Ü"ô #
Ø;?×;NÒ;Nó#
ó 
ˆÔô ô 
Ø;?¿?º?ó
ó 
ˆŒð ×ÑÐ)Ü�T×'Ñ'Ó(×0Ñ0°9Ð0Ó=ˆAØ!$×!8Ñ!8¸Ó!;×!@Ñ!@ˆDÔØ×ÑÐ'Ü�T×%Ñ%Ó&×.Ñ.°Ð.Ó;ˆAØ"×6Ñ6°qÓ9×>Ñ>ˆDÕð (r0   c                óv   — t        | j                  | j                  | j                  dz   | j                  ¬«      S )z-Returns BSpline() for the OCS representation.r(   )r  r  r  r  )r   r  r  r  r  rA   s    r1   r¯  zSplineEdge.construction_tool™  s3   € äØ×.Ñ.Ø×"Ñ"Ø—+‘+ ‘/Ø—L‘Lô	
ð 	
r0   NrU   r\   rn   )rF   r
   rV   r"   ro   rZ   )rV   r   )r*   r+   r,   rª  r#   r8   r:   ru   rS   rp   rd   rf   ra   rG   rK   rP   r¯  r/   r0   r1   r"   r"   	  sg   „ Ø€IØ�?‰?€Dó
0óð ò&ó ð&ð ò'ó ð'ð òó ðó0B$óH?ô
r0   r"   r<  )r•   r&   rõ   r[   rö   r;   rV   r   )r“   r
   rV   r=   )rI   r   rQ  zSequence[str])6Ú
__future__r   Útypingr   r   r   r   r   r_   ÚenumrØ   Úezdxf.lldxfr	   Úezdxf.lldxf.tagsr
   r   Ú
ezdxf.mathr   r   r   r   r   r   r   r   r   r   r   r   r   r   Úezdxf.math.transformtoolsr   Úezdxf.lldxf.tagwriterr   Ú__all__ÚuniqueÚIntEnumr$   r#   ÚABCr&   r%   r   rô   rO  rS  r   r   r   r    r!   r"   r}  r/   r0   r1   Ú<module>r     sl  ðõ #ß EÕ EÛ 
Û Û å ß -÷÷ ÷ ÷ õ  3áÝ7ò€ð ‡�ô�t—|‘|ó ó ðð
 ‡�ôˆt�|‰|ó ó ðô$˜3Ÿ7™7ô $ô,�3—7‘7ô ÷:`ñ `ðH BDðØ
ðØ*/ðØ;>ðàóóð"*Ø ð*Ø+8ó*ôD/Ð'ô D/ôN~Ð#ô ~ôB+@ˆ|ô +@ô\s
ˆlô s
ôl`#�,ô `#ôFW
�ô W
ðt �h ¨°jÐA�r0   