Ë
    Jÿié  ã                   óê  — U d Z ddlZddlmc mZ ddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZmZ ddlmZ ddlmZmZ ddlZddlZdd	lmZ dd
lmZmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl$m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z<m=Z= ddl>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZEmFZFmGZGmHZH ddlImJZJ ej–                  ej˜                  z  ejš                  z  ejœ                  z  ZOeePd<   	  G d„ d«      ZQ G d„ d e«      ZR G d!„ d"eR«      ZS G d#„ d$e«      ZT G d%„ d&e«      ZUd'„ ZVd(„ ZWd)e<d*e<d+eXfd,„ZY G d-„ d.«      ZZ G d/„ d0eZ«      Z[ G d1„ d2eZ«      Z\y)3a÷  
build123d exporters

name: exporters.py
by:   JRMobley
date: March 19th, 2023

desc:
    This python module contains exporters for SVG and DXF file formats.

license:

    Copyright 2023 JRMobley

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

é    N)Úcopy)ÚEnumÚauto)ÚPathLikeÚfsdecode)ÚAnyÚ	TypeAlias)Úwarn)ÚCallableÚIterable)Úzoom)ÚRGBÚaci2rgb)ÚVec2)ÚBRepLib)ÚBRepTools_WireExplorer)ÚGeom_BezierCurve)ÚGeomConvert)Ú%GeomConvert_BSplineCurveToBezierCurve)Úgp_Ax2Úgp_DirÚgp_PntÚgp_VecÚgp_XYZ)ÚHLRAlgo_Projector)ÚHLRBRep_AlgoÚHLRBRep_HLRToShape)ÚTopAbs_OrientationÚTopAbs_ShapeEnum)ÚTopExp_Explorer)ÚTopoDS)ÚSelf)ÚUnitÚGeomType)Ú	TOLERANCEÚColorÚVectorÚ
VectorLike)ÚBoundBoxÚCompoundÚEdgeÚWireÚShape©ÚUNITS_PER_METERÚPathSegmentc                   óJ   — e Zd ZdZddddddœdededz  d	ed
edededz  fd„Zy)ÚDrawingzA base drawing objectN)é   éÿÿÿÿr3   )r   r   r3   T)Úlook_atÚ	look_fromÚlook_upÚwith_hiddenÚfocusÚshaper5   r6   r7   r8   r9   c                ó  — t        «       }|j                  |j                  «       |rt        |«      n|j	                  «       }t        |«      j                  «       }	t        |«      j                  «       j                  |	«      }
t        |j                  «       |	j                  «       |
j                  «       «      }|�t        ||«      }nt        |«      }|j                  |«       |j                  «        |j                  «        t        |«      }g }|j                  «       }|j!                  «       s|j#                  |«       |j%                  «       }|j!                  «       s|j#                  |«       |j'                  «       }|j!                  «       s|j#                  |«       g }|rb|j)                  «       }|j!                  «       s|j#                  |«       |j+                  «       }|j!                  «       s|j#                  |«       |D ]  }t-        j.                  |t0        «       Œ |D ]  }t-        j.                  |t0        «       Œ t3        t5        t6        |«      «      | _        t3        t5        t6        |«      «      | _        y ©N)r   ÚAddÚwrappedr'   ÚcenterÚ
normalizedÚcrossr   Úto_pntÚto_dirr   Ú	ProjectorÚUpdateÚHider   Ú	VCompoundÚIsNullÚappendÚRg1LineVCompoundÚOutLineVCompoundÚ	HCompoundÚOutLineHCompoundr   ÚBuildCurves3d_sr%   r*   Úmapr-   Úvisible_linesÚhidden_lines)Úselfr:   r5   r6   r7   r8   r9   ÚhlrÚprojection_originÚprojection_dirÚprojection_xÚcoordinate_systemÚ	projectorÚ
hlr_shapesÚvisibleÚvisible_sharp_edgesÚvisible_smooth_edgesÚvisible_contour_edgesÚhiddenÚhidden_sharp_edgesÚhidden_contour_edgesÚels                         úd/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/build123d/exporters.pyÚ__init__zDrawing.__init__R   s	  € ô ‹nˆØ�‰�—‘Ôá/6œF 7œO¸E¿L¹L»NÐÜ 	Ó*×5Ñ5Ó7ˆÜ˜g“×1Ñ1Ó3×9Ñ9¸.ÓIˆÜ"Ø×$Ñ$Ó&¨×(=Ñ(=Ó(?À×ATÑATÓAVó
Ðð ÐÜ)Ð*;¸UÓC‰Iä)Ð*;Ó<ˆIà�‰�iÔ Ø�
‰
ŒØ�‰Œ
ä'¨Ó,ˆ
àˆà(×2Ñ2Ó4ÐØ"×)Ñ)Ô+Ø�N‰NÐ.Ô/à)×:Ñ:Ó<ÐØ#×*Ñ*Ô,Ø�N‰NÐ/Ô0à *× ;Ñ ;Ó =ÐØ$×+Ñ+Ô-Ø�N‰NÐ0Ô1àˆÙØ!+×!5Ñ!5Ó!7ÐØ%×,Ñ,Ô.Ø—‘Ð0Ô1à#-×#>Ñ#>Ó#@Ð Ø'×.Ñ.Ô0Ø—‘Ð2Ô3ó ˆBÜ×#Ñ# B¬	Õ2ð ãˆBÜ×#Ñ# B¬	Õ2ð ô &¤c¬%°Ó&9Ó:ˆÔÜ$¤S¬°Ó%7Ó8ˆÕó    )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   r(   ÚboolÚfloatrc   © rd   rb   r2   r2   O   se   „ Ùð &*Ø *Ø'Ø Ø"ò@9àð@9ð ˜dÑ"ð	@9ð
 ð@9ð ð@9ð ð@9ð �t‰|ô@9rd   r2   c                   ó    — e Zd ZdZed„ «       Zy)ÚAutoNameEnumzCAn enum class that automatically sets members' value to their name.c                 ó   — | S r<   rk   )ÚnameÚstartÚcountÚlast_valuess       rb   Ú_generate_next_value_z"AutoNameEnum._generate_next_value_œ   s   € àˆrd   N)re   rf   rg   rh   Ústaticmethodrs   rk   rd   rb   rm   rm   ™   s   „ ÙMàñó ñrd   rm   c                   ó¦  — e Zd ZdZ e«       Z e«       Z e«       Z e«       Z e«       Z	 e«       Z
 e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       Z e«       ZdZdZdZ dZ!dZ"dZ#dZ$d	Z%d
Z&dZ'dZ(dZ)dZ*dZ+y)ÚLineTypez
Line TypesÚACAD_ISO02W100ÚACAD_ISO03W100ÚACAD_ISO04W100ÚACAD_ISO05W100ÚACAD_ISO06W100ÚACAD_ISO07W100ÚACAD_ISO08W100ÚACAD_ISO09W100ÚACAD_ISO10W100ÚACAD_ISO11W100ÚACAD_ISO12W100ÚACAD_ISO13W100ÚACAD_ISO14W100ÚACAD_ISO15W100N),re   rf   rg   rh   r   Ú
CONTINUOUSÚBORDERÚBORDER2ÚBORDERX2ÚCENTERÚCENTER2ÚCENTERX2ÚDASHDOTÚDASHDOT2Ú	DASHDOTX2ÚDASHEDÚDASHED2ÚDASHEDX2ÚDIVIDEÚDIVIDE2ÚDIVIDEX2ÚDOTÚDOT2ÚDOTX2ÚHIDDENÚHIDDEN2ÚHIDDENX2ÚPHANTOMÚPHANTOM2Ú	PHANTOMX2ÚISO_DASHÚISO_DASH_SPACEÚISO_LONG_DASH_DOTÚISO_LONG_DASH_DOUBLE_DOTÚISO_LONG_DASH_TRIPLE_DOTÚISO_DOTÚISO_LONG_DASH_SHORT_DASHÚISO_LONG_DASH_DOUBLE_SHORT_DASHÚISO_DASH_DOTÚISO_DOUBLE_DASH_DOTÚISO_DASH_DOUBLE_DOTÚISO_DOUBLE_DASH_DOUBLE_DOTÚISO_DASH_TRIPLE_DOTÚISO_DOUBLE_DASH_TRIPLE_DOTrk   rd   rb   rv   rv   ¡   s  „ Ùá“€Já‹V€FÙ‹f€GÙ‹v€HÙ‹V€FÙ‹f€GÙ‹v€HÙ‹f€GÙ‹v€HÙ“€IÙ‹V€FÙ‹f€GÙ‹v€HÙ‹V€FÙ‹f€GÙ‹v€HÙ
‹&€CÙ‹6€DÙ‹F€EÙ‹V€FÙ‹f€GÙ‹v€HÙ‹f€GÙ‹v€HÙ“€Ià€HØ%€NØ(ÐØ/ÐØ/ÐØ€GØ/ÐØ&6Ð#Ø#€LØ*ÐØ*ÐØ!1ÐØ*ÐØ!1Ñrd   rv   c                   ó4   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
Zy)Ú
ColorIndexÚColorsr3   é   é   é   é   é   é   é   é	   N)re   rf   rg   rh   ÚREDÚYELLOWÚGREENÚCYANÚBLUEÚMAGENTAÚBLACKÚGRAYÚ
LIGHT_GRAYrk   rd   rb   r­   r­   Ï   s2   „ Ùà
€CØ€FØ€EØ€DØ€DØ€GØ€EØ€DØ�Jrd   r­   c                   ó    — e Zd ZdZdZ	 dZ	 dZy)Ú	DotLengthzBLine type dash pattern dot widths, expressed in tenths of an inch.ç        g{®Gáz„?gš™™™™™É?N)re   rf   rg   rh   ÚTRUE_DOTÚINKSCAPE_COMPATÚQCAD_IMPERIALrk   rd   rb   rÁ   rÁ   Ý   s#   „ ÙLà€HØFà€Oðð €Mð;rd   rÁ   c                  ó†   — | D �cg c]  }t        |«      ‘Œ }}t        |«      g| ¢D �cg c]  }|dz  ‘Œ	 }}|S c c}w c c}w )z¼Prepare an ANSI line pattern for ezdxf usage.
    Input pattern is specified in inches.
    Output is given in tenths of an inch, and the total pattern length
    is prepended to the list.é
   ©ÚabsÚsum©ÚargsÚlÚabs_argsÚresults       rb   Úansi_patternrÐ   ì   sO   € ñ
 !%Ó%¡˜1”�A• €HÐ%Ü!$ X£Ð 6°Ñ 6Ó7Ñ 6˜1ˆq�2‹vÐ 6€FÐ7Ø€Mùò &ùÚ7ó   …9©>c                  ó†   — | D �cg c]  }t        |«      ‘Œ }}t        |«      g| ¢D �cg c]  }|dz  ‘Œ	 }}|S c c}w c c}w )zÀPrepare an ISO line pattern for ezdxf usage.
    Input pattern is specified in millimeters.
    Output is given in tenths of an inch, and the total pattern length
    is prepended to the list.çR¸…ëQ@rÈ   rË   s       rb   Úiso_patternrÔ   ö   sO   € ñ
 !%Ó%¡˜1”�A• €HÐ%Ü#& x£=Ð"8°4Ñ"8Ó9Ñ"8˜Qˆq�4‹xÐ"8€FÐ9Ø€Mùò &ùÚ9rÑ   Ú	from_unitÚto_unitÚreturnc                 ó,   — t         |   t         |    z  }|S )zLReturn the multiplicative conversion factor to go from from_unit to to_unit.r.   )rÕ   rÖ   rÏ   s      rb   Úunit_conversion_scalerÙ      s   € ä˜WÑ%¬¸	Ñ(BÑB€FØ€Mrd   c                   ó:  — e Zd ZdZdZej                  ZdZe	j                  Zi e	j                  j                  ddgf“e	j                  j                  d eddddd	d«      f“e	j                  j                  d
 eddddd	d«      f“e	j                   j                  d eddddd	d«      f“e	j"                  j                  d edddd«      f“e	j$                  j                  d edddd«      f“e	j&                  j                  d edddd«      f“e	j(                  j                  d eddd	d«      f“e	j*                  j                  d eddd	d«      f“e	j,                  j                  d eddd	d«      f“e	j.                  j                  d edd«      f“e	j0                  j                  d edd«      f“e	j2                  j                  d edd«      f“e	j4                  j                  d eddd	dd	d«      f“e	j6                  j                  d eddd	dd	d«      f“e	j8                  j                  d eddd	dd	d«      f“e	j:                  j                  d  ed	d«      f“i e	j<                  j                  d! ed	d«      f“e	j>                  j                  d" ed	d«      f“e	j@                  j                  d# edd«      f“e	jB                  j                  d$ edd%«      f“e	jD                  j                  d& edd«      f“e	jF                  j                  d' edddddd«      f“e	jH                  j                  d( ed)ddddd«      f“e	jJ                  j                  d* edddddd«      f“e	jL                  j                  d+ e'd,d-«      f“e	jP                  j                  d. e'd,d/«      f“e	jR                  j                  d0 e'd1d-d	d-«      f“e	jT                  j                  d2 e'd1d-d	d-d	d-«      f“e	jV                  j                  d3 e'd1d-d	d-d	d-d	d-«      f“e	jX                  j                  d4 e'd	d-«      f“e	jZ                  j                  d5 e'd1d-d6d-«      f“e	j\                  j                  d7 e'd1d-d6d-d6d-«      f“e	j^                  j                  d8 e'd,d-d	d-«      f“¥e	j`                  j                  d9 e'd,d-d,d-d	d-«      fe	jb                  j                  d: e'd,d-d	d-d	d-«      fe	jd                  j                  d; e'd,d-d,d-d	d-d	d-«      fe	jf                  j                  d< e'd,d-d	d-d	d-d	d-«      fe	jh                  j                  d= e'd,d-d,d-d	d-d	d-d	d-«
      fi¥Z5e6jn                  d>e6jp                  d?e6jr                  d@e6jt                  dAe6jv                  dBiZ<yC)DÚExport2Dz'Base class for 2D exporters (DXF, SVG).g•Ö&è.>g
×£p=
·?ÚSolidrÂ   z.Border __ __ . __ __ . __ __ . __ __ . __ __ .g      à?g      Ð¿r   z.Border (.5x) __.__.__.__.__.__.__.__.__.__.__.g      Ð?g      À¿z-Border (2x) ____  ____  .  ____  ____  .  ___ç      ð?g      à¿z.Center ____ _ ____ _ ____ _ ____ _ ____ _ ____g      ô?z.Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___g      è?g      À?z-Center (2x) ________  __  ________  __  _____g      @z.Dash dot __ . __ . __ . __ . __ . __ . __ . __z-Dash dot (.5x) _._._._._._._._._._._._._._._.z,Dash dot (2x) ____  .  ____  .  ____  .  ___z/Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _z/Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ z-Dashed (2x) ____  ____  ____  ____  ____  ___z/Divide ____ . . ____ . . ____ . . ____ . . ____z.Divide (.5x) __..__..__..__..__..__..__..__.._z-Divide (2x) ________  .  .  ________  .  .  _z3Dot . . . . . . . . . . . . . . . . . . . . . . . .z2Dot (.5x) ........................................z1Dot (2x) .  .  .  .  .  .  .  .  .  .  .  .  .  .z0Hidden __ __ __ __ __ __ __ __ __ __ __ __ __ __z/Hidden (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ g      °¿z/Hidden (2x) ____ ____ ____ ____ ____ ____ ____ z/Phantom ______  __  __  ______  __  __  ______ z-Phantom (.5x) ___ _ _ ___ _ _ ___ _ _ ___ _ _g      ä?z-Phantom (2x) ____________    ____    ____   _z/ISO dash __ __ __ __ __ __ __ __ __ __ __ __ __é   éýÿÿÿz/ISO dash space __    __    __    __    __    __iîÿÿÿz/ISO long-dash dot ____ . ____ . ____ . ____ . _é   z0ISO long-dash double-dot ____ .. ____ .. ____ . z/ISO long-dash triple-dot ____ ... ____ ... ____z0ISO dot . . . . . . . . . . . . . . . . . . . . z/ISO long-dash short-dash ____ __ ____ __ ____ _r³   z/ISO long-dash double-short-dash ____ __ __ ____z0ISO dash dot __ . __ . __ . __ . __ . __ . __ . z0ISO double-dash dot __ __ . __ __ . __ __ . __ _z0ISO dash double-dot __ . . __ . . __ . . __ . . z0ISO double-dash double-dot __ __ . . __ __ . . _z0ISO dash triple-dot __ . . . __ . . . __ . . . _z0ISO double-dash triple-dot __ __ . . . __ __ . .gš™™™™™¹?g�?rÓ   g¨ÆK7‰AÐ?g¢ÑÄÎd?N)=re   rf   rg   rh   ÚPARAMETRIC_TOLERANCEr­   r½   ÚDEFAULT_COLOR_INDEXÚDEFAULT_LINE_WEIGHTrv   r…   ÚDEFAULT_LINE_TYPEÚvaluer†   rÐ   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rÔ   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   ÚLINETYPE_DEFSr#   ÚINÚFTÚMMÚCMÚMÚLTYPE_SCALErk   rd   rb   rÛ   rÛ     sh  „ Ù1ð  Ðà$×*Ñ*ÐØÐØ ×+Ñ+ÐðZØ×Ñ×!Ñ! G¨c¨UÐ#3ðZà�‰×ÑØ<Ù˜˜e S¨%°°EÓ:ð 
ðZð 	×Ñ×ÑØ<Ù˜˜v t¨V°Q¸Ó?ð!
ðZð 	×Ñ×ÑØ;Ù˜˜d C¨¨q°$Ó7ð"
ðZð 	�‰×ÑØ<Ù˜˜u d¨EÓ2ð 
ðZð$ 	×Ñ×ÑØ<Ù˜˜v u¨fÓ5ð!
ð%Zð, 	×Ñ×ÑØ;Ù˜˜d C¨Ó.ð"
ð-Zð4 	×Ñ×ÑØ<Ù˜˜e Q¨Ó.ð!
ð5Zð< 	×Ñ×ÑØ;Ù˜˜v q¨&Ó1ð"
ð=ZðD 	×Ñ× Ñ Ø:Ù˜˜d A tÓ,ð#
ðEZðL 	�‰×ÑØ=Ù˜˜eÓ$ð 
ðMZðT 	×Ñ×ÑØ=Ù˜˜vÓ&ð!
ðUZð\ 	×Ñ×ÑØ;Ù˜˜dÓ#ð"
ð]Zðd 	�‰×ÑØ=Ù˜˜e Q¨¨q°%Ó8ð 
ðeZðl 	×Ñ×ÑØ<Ù˜˜v q¨&°!°VÓ<ð!
ðmZðt 	×Ñ×ÑØ;Ù˜˜d A t¨Q°Ó5ð"
ðuZð| 	�‰×ÑØAÙ˜˜EÓ"ð
ñ}ZðD 	�‰×ÑØ@Ù˜˜FÓ#ð
ðEZðL 	�‰×ÑØ?Ù˜˜DÓ!ð
ðMZðT 	�‰×ÑØ>Ù˜˜vÓ&ð 
ðUZð\ 	×Ñ×ÑØ=Ù˜ Ó(ð!
ð]Zðd 	×Ñ×ÑØ=Ù˜˜eÓ$ð"
ðeZðl 	×Ñ×ÑØ=Ù˜˜u d¨E°4¸Ó?ð!
ðmZðt 	×Ñ×ÑØ;Ù˜ ¨¨v°u¸fÓEð"
ðuZð| 	×Ñ× Ñ Ø;Ù˜˜d C¨¨s°DÓ9ð#
ð}ZðD 	×Ñ×ÑØ=Ù˜˜BÓð"
ðEZðL 	×Ñ×%Ñ%Ø=Ù˜˜CÓ ð(
ðMZðT 	×"Ñ"×(Ñ(Ø=Ù˜˜B  2Ó&ð+
ðUZð\ 	×)Ñ)×/Ñ/Ø>Ù˜˜B  2 q¨"Ó-ð2
ð]Zðd 	×)Ñ)×/Ñ/Ø=Ù˜˜B  2 q¨"¨a°Ó4ð2
ðeZðl 	×Ñ×ÑØ>Ù˜˜2Óð!
ðmZðt 	×)Ñ)×/Ñ/Ø=Ù˜˜B  2Ó&ð2
ðuZð| 	×0Ñ0×6Ñ6Ø=Ù˜˜B  2 q¨"Ó-ð9
ð}ZðD 	×Ñ×#Ñ#Ø>Ù˜˜B  2Ó&ð&
ñEZðL 	×$Ñ$×*Ñ*Ø>Ù˜˜B  B¨¨2Ó.ð-
ð 	×$Ñ$×*Ñ*Ø>Ù˜˜B  2 q¨"Ó-ð-
ð 	×+Ñ+×1Ñ1Ø>Ù˜˜B  B¨¨2¨q°"Ó5ð4
ð 	×$Ñ$×*Ñ*Ø>Ù˜˜B  2 q¨"¨a°Ó4ð-
ð 	×+Ñ+×1Ñ1Ø>Ù˜˜B  B¨¨2¨q°"°a¸Ó<ð4
ñmZ€Mð| 	�‰�Ø�‰�Ø�‰�Ø�‰�Ø�‰�ð�Krd   rÛ   c                   óŠ  — e Zd ZdZej
                  dej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  iZej                  ej                  ej                  hZej                  ej                  dddfdedededz  dedz  dedz  f
d	„Zdddd
œdededz  dedz  dedz  def
d„Zdedefd„Zddeee   z  dedefd„Zddedefd„Zdeez  ez  fd„Zdee z  e!z  e"z  de#fd„Z$de%de&fd„Z'de%de&fd„Z(de%de&fd„Z)de%fd„Z*de%de&fd„Z+e,jZ                  e'e,j\                  e(e,j^                  e)e,j`                  e*iZ1de%de&fd„Z2y) Ú	ExportDXFa~  
    The ExportDXF class provides functionality for exporting 2D shapes to DXF
    (Drawing Exchange Format) format. DXF is a widely used file format for
    exchanging CAD (Computer-Aided Design) data between different software
    applications.


    Args:
        version (str, optional): The DXF version to use for the output file.
            Defaults to ezdxf.DXF2013.
        unit (Unit, optional): The unit used for the exported DXF. It should be
            one of the Unit enums: Unit.MC, Unit.MM, Unit.CM,
            Unit.M, Unit.IN, or Unit.FT. Defaults to Unit.MM.
        color (Optional[ColorIndex], optional): The default color index for shapes.
            It can be specified as a ColorIndex enum or None.. Defaults to None.
        line_weight (Optional[float], optional): The default line weight
            (stroke width) for shapes, in millimeters. . Defaults to None.
        line_type (Optional[LineType], optional): e default line type for shapes.
            It should be a LineType enum or None.. Defaults to None.


    Example:

        .. code-block:: python

            exporter = ExportDXF(unit=Unit.MM, line_weight=0.5)
            exporter.add_layer("Layer 1", color=ColorIndex.RED, line_type=LineType.DASHED)
            exporter.add_shape(shape_object, layer="Layer 1")
            exporter.write("output.dxf")

    Raises:
        ValueError: unit not supported

    é   NÚversionÚunitÚcolorÚline_weightÚ	line_typec                 óf  — d| _         || j                  vrt        d|j                  › d�«      ‚|t        j
                  v r't        j                  t        j                     | _
        nd| _
        t        j                  || j                  |   d¬«      | _        | j                  j                  «       | _        | j                  j                   j#                  d«      }|�|j$                  |_        |�t)        |dz  «      |j*                  _        |�!| j/                  |«      |j*                  _        y y )	Nr   zunit `z` not supported.r3   F)Ú
dxfversionÚunitsÚsetupÚ0éd   )Ú_non_planar_point_countÚ_UNITS_LOOKUPÚ
ValueErrorro   rî   ÚMETRIC_UNITSrÛ   rì   r#   ré   Ú_linetype_scaleÚezdxfÚnewÚ	_documentÚ
modelspaceÚ_modelspaceÚlayersÚgetrå   rò   ÚroundÚdxfÚ
lineweightÚ	_linetypeÚlinetype)rR   rð   rñ   rò   ró   rô   Údefault_layers          rb   rc   zExportDXF.__init__ü  s  € ð ()ˆÔ$Ø�t×)Ñ)Ñ)Ü˜v d§i¡i [Ð0@ÐAÓBÐBØ”9×)Ñ)Ñ)Ü#+×#7Ñ#7¼¿¹Ñ#@ˆDÕ à#$ˆDÔ ÜŸ™ØØ×$Ñ$ TÑ*Øô
ˆŒð
  Ÿ>™>×4Ñ4Ó6ˆÔàŸ™×-Ñ-×1Ñ1°#Ó6ˆØÐØ"'§+¡+ˆMÔØÐ"Ü+0°¸sÑ1BÓ+CˆM×ÑÔ(ØÐ Ø)-¯©¸	Ó)BˆM×ÑÕ&ð !rd   )rò   ró   rô   ro   r×   c                óÐ   — i }|�| j                  |«      }||d<   |�|j                  |d<   |�t        |dz  «      |d<    | j                  j                  j
                  |fi |¤Ž | S )a  add_layer

        Adds a new layer to the DXF export with the given properties.

        Args:
            name (str): The name of the layer definition. Must be unique among all layers.
            color (Optional[ColorIndex], optional): The color index for shapes on this layer.
                It can be specified as a ColorIndex enum or None. Defaults to None.
            line_weight (Optional[float], optional): The line weight (stroke width) for shapes
                on this layer, in millimeters. Defaults to None.
            line_type (Optional[LineType], optional): The line type for shapes on this layer.
                It should be a LineType enum or None. Defaults to None.

        Returns:
            Self: DXF document with additional layer
        r  rò   rú   r	  )r
  rå   r  r  r  Úadd)rR   ro   rò   ró   rô   Úkwargsr  s          rb   Ú	add_layerzExportDXF.add_layer  sx   € ð4 "$ˆàÐ Ø—~‘~ iÓ0ˆHØ!)ˆF�:ÑàÐØ#Ÿk™kˆF�7‰OàÐ"Ü#(¨°sÑ):Ó#;ˆF�<Ñ à!ˆ�‰×Ñ×!Ñ! $Ñ1¨&Ò1Øˆrd   c                 ó`  — |j                   }|| j                  j                  vr„|t        j                  v rgt        j                  j                  |«      \  }}| j                  j                  j                  ||D �cg c]  }| j                  |z  ‘Œ c}|¬«       |S t        d«      ‚|S c c}w )zhEnsure that the specified LineType has been defined in the document,
        and return its string name.)ro   ÚpatternÚdescriptionzUnknown linetype `{linetype}`.)	rå   r  Ú	linetypesrÛ   ræ   r  r  rÿ   rý   )rR   rô   r  Údescr  Úvs         rb   r
  zExportDXF._linetypeG  s©   € ð —?‘?ˆØ˜4Ÿ>™>×3Ñ3Ñ3ð œ8×1Ñ1Ñ1Ü (× 6Ñ 6× :Ñ :¸8Ó D‘��gØ—‘×(Ñ(×,Ñ,Ø!Ù?FÓG¹w¸!˜T×1Ñ1°AÓ5¸wÑGØ $ð -ô ð ˆô !Ð!AÓBÐBØˆùò Hs   Á=B+
r:   Úlayerc                 óú   — t        |t        «      r| j                  ||«       n|D ]  }| j                  ||«       Œ | j                  dkD  r/t	        d«       t	        d«       t	        d| j                  › d�«       | S )aë  add_shape

        Adds a shape to the specified layer.

        Args:
            shape (Shape | Iterable[Shape]): The shape or collection of shapes to be
                  added. It can be a single Shape object or an iterable of Shape objects.
            layer (str, optional): The name of the layer where the shape will be
                added. If not specified, the default layer will be used. Defaults to "".

        Returns:
            Self: Document with additional shape
        r   ú1WARNING, exporting non-planar shape to 2D format.ú%  This is probably not what you want.ú  ú# points found outside the XY plane.)Ú
isinstancer-   Ú_add_single_shaperû   Úprint)rR   r:   r  Úss       rb   Ú	add_shapezExportDXF.add_shape[  s{   € ô �eœUÔ#Ø×"Ñ" 5¨%Õ0ã�Ø×&Ñ& q¨%Õ0ð à×'Ñ'¨!Ò+ÜÐEÔFÜÐ9Ô:ÜØ�T×1Ñ1Ð2Ð2UÐVôð ˆrd   c                 ód   — i }|r||d<   |j                  «       D ]  }| j                  ||«       Œ y )Nr  )ÚedgesÚ_convert_edge)rR   r:   r  Ú
attributesÚedges        rb   r  zExportDXF._add_single_shapev  s4   € Øˆ
ÙØ"'ˆJ�wÑØ—K‘K–MˆDØ×Ñ˜t ZÕ0ñ "rd   Ú	file_namec                 óŠ   — t        j                  | j                  «       | j                  j	                  t        |«      «       y)zÛwrite

        Writes the DXF data to the specified file name.

        Args:
            file_name (PathLike |  str |  bytes): The file name (including path) where
                the DXF data will be written.
        N)r   Úextentsr  r  Úsaveasr   )rR   r'  s     rb   ÚwritezExportDXF.write  s-   € ô 	�‰�T×%Ñ%Ô&Ø�‰×Ñœh yÓ1Õ2rd   Úptc                 ó|  — t        |t        t        t        f«      r1|j	                  «       |j                  «       |j                  «       }}}nBt        |t        «      rt        |«      \  }}}n"t        dt        |«      j                  › d�«      ‚t        |«      dkD  r| xj                  dz  c_        t        ||«      S )zYCreate a Vec2 from a gp_Pnt or Vector.
        This method also checks for points z != 0.z:Expected `gp_Pnt`, `gp_XYZ`, `gp_Vec`, or `Vector`.  Got `ú`.ç�íµ ÷Æ°>r3   )r  r   r   r   ÚXÚYÚZr'   ÚtupleÚ	TypeErrorÚtypere   rÉ   rû   r   )rR   r,  ÚxÚyÚzs        rb   Ú_convert_pointzExportDXF._convert_point‘  s�   € ô �bœ6¤6¬6Ð2Ô3ØŸ™› §¡£¨¯©«�1�‰QÜ˜œFÔ#Ü˜b›	‰IˆQ�‘1äØLÌTÐRTËX×M^ÑM^ÐL_Ð_aÐbóð ô ˆq‹6�DŠ=Ø×(Ò(¨AÑ-Õ(Ü�A�q‹zÐrd   r&  Úattribsc                 ó²   — | j                   j                  | j                  |j                  «       «      | j                  |j	                  «       «      |«       y)z.Converts a Line object into a DXF line entity.N)r  Úadd_liner9  Ústart_pointÚ	end_point©rR   r&  r:  s      rb   Ú_convert_linezExportDXF._convert_line¢  sE   € à×Ñ×!Ñ!Ø×Ñ × 0Ñ 0Ó 2Ó3Ø×Ñ §¡Ó 0Ó1Øõ	
rd   c                 ó6  — |j                  «       }|j                  «       }| j                  |j                  «       «      }|j	                  «       }|j                  «       r| j                  j                  |||«       y|j                  «       j                  «       }|j                  «       j                  «       }t        ddd«      j                  |t        ddd«      «      }	|j                  «       }
|j                  «       }|j                  «       dkD  r3t!        j"                  |	|
z   «      }t!        j"                  |	|z   «      }d}n2t!        j"                  |	|
z
  «      }t!        j"                  |	|z
  «      }d}| j                  j%                  ||||||«       y)z2Converts a Circle object into a DXF circle entity.r3   r   TFN)Úgeom_adaptorÚCircler9  ÚLocationÚRadiusÚIsClosedr  Ú
add_circleÚXAxisÚ	DirectionÚAxisr   ÚAngleWithRefÚFirstParameterÚLastParameterr2  ÚmathÚdegreesÚadd_arc)rR   r&  r:  ÚcurveÚcircler?   ÚradiusÚx_axisÚz_axisÚphiÚu1Úu2Úangle1Úangle2Úccws                  rb   Ú_convert_circlezExportDXF._convert_circle¬  sD  € à×!Ñ!Ó#ˆØ—‘“ˆØ×$Ñ$ V§_¡_Ó%6Ó7ˆØ—‘“ˆà�>‰>ÔØ×Ñ×'Ñ'¨°¸Õ@ð —\‘\“^×-Ñ-Ó/ˆFØ—[‘[“]×,Ñ,Ó.ˆFÜ˜˜A˜q“/×.Ñ.¨v´v¸aÀÀA³ÓGˆCØ×%Ñ%Ó'ˆBØ×$Ñ$Ó&ˆBØ�x‰x‹z˜AŠ~ÜŸ™ c¨B¡hÓ/�ÜŸ™ c¨B¡hÓ/�Ø‘äŸ™ c¨B¡hÓ/�ÜŸ™ c¨B¡hÓ/�Ø�Ø×Ñ×$Ñ$ V¨V°V¸VÀSÈ'ÕRrd   c                 ób  — |j                  «       }|j                  «       }|j                  «       }|j                  «       }|j	                  «       }|t        |j                  «       j                  «       «      z  }|j                  «       j                  «       }	|	j                  «       dkD  r!|j                  «       }
|j                  «       }n"|j                  «        }
|j                  «        }| j                  j                  | j                  |«      | j                  |«      ||z  |
||«       y)z5Converts an Ellipse object into a DXF ellipse entity.r   N)rB  ÚEllipseÚMinorRadiusÚMajorRadiusrD  r   rH  rI  rJ  r2  rL  rM  r  Úadd_ellipser9  )rR   r&  r:  ÚgeomÚellipseÚminor_radiusÚmajor_radiusr?   Ú
major_axisÚmain_dirrp   Úends               rb   Ú_convert_ellipsezExportDXF._convert_ellipseÈ  s  € à× Ñ Ó"ˆØ—,‘,“.ˆØ×*Ñ*Ó,ˆØ×*Ñ*Ó,ˆØ×!Ñ!Ó#ˆØ!¤F¨7¯=©=«?×+DÑ+DÓ+FÓ$GÑGˆ
Ø—<‘<“>×+Ñ+Ó-ˆØ�:‰:‹<˜!ÒØ×'Ñ'Ó)ˆEØ×$Ñ$Ó&‰Cà×'Ñ'Ó)Ð)ˆEØ×&Ñ&Ó(Ð(ˆCØ×Ñ×$Ñ$Ø×Ñ Ó'Ø×Ñ 
Ó+Ø˜<Ñ'ØØØõ	
rd   c                 ó,  — |j                  «       }|j                  «       }|j                  «       j                  «       }|j                  «       }|j	                  «       }t        j                  |||t        j                  «      }|j                  �|j                  €t        d|› d�«      ‚|j                  j                  j                  «       }|j                  |«       |j                  «       dz   }	t        |j!                  «       «      }
|j#                  «       D �cg c]  }| j%                  |«      ‘Œ }}|j'                  «       r:t)        d|j+                  «       dz   «      D �cg c]  }|j-                  |«      ‘Œ c}nd}|j/                  «       r)|j1                  «       |j3                  «       z
  }||d| z  }t4        j6                  j9                  ||	|
|«      }| j:                  j=                  |¬«      j?                  |«       yc c}w c c}w )z3Converts a BSpline object into a DXF spline entity.NúEdge is empty Ú.r3   )Ú
dxfattribs) Ú
to_splinesrB  ÚCurverL  rM  r   ÚSplitBSplineCurve_srÛ   rá   r>   Úlocationrý   ÚTransformationÚ	TransformÚDegreeÚlistÚKnotSequenceÚPolesr9  Ú
IsRationalÚrangeÚNbPolesÚWeightÚ
IsPeriodicÚNbKnotsÚLastUKnotIndexr   rN  ÚBSpliner  Ú
add_splineÚapply_construction_tool)rR   r&  r:  ÚadaptorrQ  rW  rX  ÚsplineÚtÚorderÚknotsÚpÚpolesÚiÚweightsÚpadÚ
dxf_splines                    rb   Ú_convert_bsplinezExportDXF._convert_bsplineâ  sÓ  € ð
 �‰Ó ˆð ×#Ñ#Ó%ˆØ—‘“×%Ñ%Ó'ˆØ×#Ñ#Ó%ˆØ×"Ñ"Ó$ˆô ×0Ñ0ØØØÜ×)Ñ)ó	
ˆð �<‰<Ð 4§=¡=Ð#8Ü˜~¨d¨V°1Ð5Ó6Ð6Ø�M‰M×!Ñ!×0Ñ0Ó2ˆØ×Ñ˜Ôà—‘“ !Ñ#ˆÜ�V×(Ñ(Ó*Ó+ˆØ17·±´Ó@±¨A�×$Ñ$ QÕ'°ˆÐ@ð × Ñ Ô"ô (-¨Q°·±Ó0@À1Ñ0DÔ'EÓFÑ'E !ˆV�]‰]˜1ÕÐ'EÒFàð 	ð ×ÑÔØ—.‘.Ó" V×%:Ñ%:Ó%<Ñ<ˆCØ�U˜4˜C�[Ñ ˆEä—Z‘Z×'Ñ'¨¨u°e¸WÓEˆ
à×Ñ×#Ñ#¨wÐ#Ó7×OÑOØõ	
ùò AùâFs   ÄHÅ(Hc                 ó(   — | j                  ||«       y)z9Converts any other type of Edge object into a DXF entity.N)r�  r?  s      rb   Ú_convert_otherzExportDXF._convert_other  s   € à×Ñ˜d GÕ,rd   c                 ó„   — |j                   }| j                  j                  |t        j                  «      } || ||«       y r<   )Ú	geom_typeÚ_CONVERTER_LOOKUPr  rî   r�  )rR   r&  r:  r‘  Úconverts        rb   r$  zExportDXF._convert_edge"  s5   € Ø—N‘Nˆ	Ø×(Ñ(×,Ñ,¨Y¼	×8PÑ8PÓQˆÙ��d˜GÕ$rd   )Ú )3re   rf   rg   rh   r#   ÚMCré   r   r÷   rê   rë   rç   rè   rü   rþ   ÚDXF2013Ústrr­   rj   rv   rc   r"   r  r
  r-   r   r!  r  r   Úbytesr+  r   r   r   r'   r   r9  r+   Údictr@  r\  ri  r�  r�  r$   ÚLINEÚCIRCLEÚELLIPSEÚBSPLINEr’  r$  rk   rd   rb   rî   rî   Ã  s_  „ ñ!ðL 	�‰�Ø�‰�—‘—‘Ø�‰�—‘—‘Ø�‰�—‘—‘Ø�‰�—‘—‘Ø�‰�—‘—‘ð€Mð 	�‰Ø�‰Ø�‰ð€Lð —}‘}Ø—W‘WØ#'Ø$(Ø%)ñCàðCð ðCð ˜DÑ ð	Cð
 ˜T‘\ðCð ˜d‘?óCðH $(Ø$(Ø%)ò'àð'ð ˜DÑ ð	'ð
 ˜T‘\ð'ð ˜d‘?ð'ð 
ó'ðV 8ð °ó ñ(˜u x°¡Ñ6ð ¸sð ÈDó ñ61 uð 1°Só 1ð3˜x¨#™~°Ñ5ó 3ð$ ¨&¡°6Ñ!9¸FÑ!Bð Àtó ð"
 $ð 
°ó 
ðS Dð S°4ó Sð8
 Tð 
°Dó 
ð4-
 Tó -
ðb- 4ð -°$ó -ð 	�‰�}Ø�‰˜Ø×ÑÐ*Ø×ÑÐ*ð	Ðð% $ð %°ô %rd   rî   c                   óZ  — e Zd ZdZeegej                  f   Ze	j                  de	j                  de	j                  diZ G d„ d«      Ze	j                  ddd	d
dej                   ej"                  ej$                  ej(                  f
de	dededededeez  ez  dz  deez  ez  dz  dededeez  fd„Zdej                   ej"                  ej$                  dœdedeez  ez  dz  deez  ez  dz  dededefd„Z	 	 d:de e!e    z  dedefd„Z"de dedefd„Z#e$d e%d!ede&e   fd"„«       Z'd e%d!ede&e(   fd#„Z)d e%d!edej                  fd$„Z*d%e+e,z  de-fd&„Z.d'ed!ede/j`                  fd(„Z1d'ed!ede&e(   fd)„Z2d'edej                  fd*„Z3d'ed!ede&e(   fd+„Z4d'edej                  fd,„Z5d'ed!ede&e(   fd-„Z6d'edej                  fd.„Z7d'ed!ede&e(   fd/„Z8d'edej                  fd0„Z9d'ed!efd1„Z:d'edej                  fd2„Z;e<jz                  e2e<j|                  e4e<j~                  e6e<j€                  e8iZAd'ed!ede&e(   fd3„ZBe<jz                  e3e<j|                  e5e<j~                  e7e<j€                  e9iZCd'edej                  fd4„ZDdefd5„ZE	 d;ded6eFdz  dej                  fd7„ZGd8eHez  eIz  fd9„ZJy)<Ú	ExportSVGaÞ  ExportSVG

    SVG file export functionality.

    The ExportSVG class provides functionality for exporting 2D shapes to SVG
    (Scalable Vector Graphics) format. SVG is a widely used vector graphics format
    that is supported by web browsers and various graphic editors.

    Args:
        unit (Unit, optional): The unit used for the exported SVG. It should be one of
            the Unit enums: Unit.MM, Unit.CM, or Unit.IN. Defaults to
            Unit.MM.
        scale (float, optional): The scaling factor applied to the exported SVG.
            Defaults to 1.
        margin (float, optional): The margin added around the exported shapes.
            Defaults to 0.
        fit_to_stroke (bool, optional): A boolean indicating whether the SVG view box
            should fit the strokes of the shapes. Defaults to True.
        precision (int, optional): The number of decimal places used for rounding
            coordinates in the SVG. Defaults to 6.
        fill_color (ColorIndex |  RGB |  None, optional): The default fill color
            for shapes. It can be specified as a ColorIndex, an RGB tuple, or None.
            Defaults to None.
        line_color (ColorIndex |  RGB |  None, optional): The default line color for
            shapes. It can be specified as a ColorIndex or an RGB tuple, or None.
            Defaults to Export2D.DEFAULT_COLOR_INDEX.
        line_weight (float, optional): The default line weight (stroke width) for
            shapes, in millimeters. Defaults to Export2D.DEFAULT_LINE_WEIGHT.
        line_type (LineType, optional): The default line type for shapes. It should be
            a LineType enum. Defaults to Export2D.DEFAULT_LINE_TYPE.
        dot_length (DotLength |  float, optional): The width of rendered dots in a
            Can be either a DotLength enum or a float value in tenths of an inch.
            Defaults to DotLength.INKSCAPE_COMPAT.


    Example:

        .. code-block:: python

            exporter = ExportSVG(unit=Unit.MM, line_weight=0.5)
            exporter.add_layer("Layer 1", fill_color=(255, 0, 0), line_color=(0, 0, 255))
            exporter.add_shape(shape_object, layer="Layer 1")
            exporter.write("output.svg")

    Raises:
        ValueError: Invalid unit.

    ÚmmÚcmÚinc            
       óL   — e Zd Zdedeez  ez  dz  deez  ez  dz  dedef
d„Z	y)úExportSVG._Layerro   Ú
fill_colorNÚ
line_colorró   rô   c                 óÆ   — dt         t        z  t        z  t        z  d z  dt        d z  fd„}|| _         ||«      | _         ||«      | _        || _        || _        g | _	        y )NÚinput_colorr×   c                 ó(  — | xt         j                  k(  r t        dddd«      }|S xxt         d˜ x�=\   } t        |j                  «      }|j                  «       \  }}}t        |||d«      }|S   xxt        d˜ x�0\   } t        |Ž }|j                  «       \  }}}t        |||d«      }|S   xxt        d˜ x�(\   } |j                  «       \  }}}t        |||d«      }|S   xxt        d˜ x�\   }	 |	}|S   €d}|S 	 t        dt        | «      › �«      ‚)a¬  
                Convert various color representations into a `Color` object.

                This function takes an input color, which can be of type `ColorIndex`, `RGB`,
                `Color`, `tuple`, or `None`, and converts it into a `Color` object. If the input
                is `None`, the function returns `None`. It handles specific cases for `ColorIndex.BLACK`
                and other `ColorIndex` values using the `aci2rgb` function.

                Args:
                    input_color (ColorIndex | RGB | Color | tuple | None): The input color to be converted.
                        - `ColorIndex`: A predefined color index from `easydxf`. Special handling for
                        `ColorIndex.BLACK` ensures it maps to `RGB(0, 0, 0)` instead of the default
                        `aci2rgb` mapping to `RGB(255, 255, 255)`.
                        - `RGB`: A direct representation of red, green, and blue components.
                        - `Color`: An existing `Color` object.
                        - `tuple`: A tuple of RGB values (e.g., `(255, 0, 0)` for red).
                        - `None`: Represents no color.

                Returns:
                    Color | None: The converted `Color` object or `None` if the input was `None`.

                Raises:
                    ValueError: If the input color type is unsupported.

                Notes:
                    - The `easydxf` color indices BLACK and WHITE have the same value (7), and both
                    are mapped to `(255, 255, 255)` by the `aci2rgb()` function. This implementation
                    overrides the default mapping to prefer `(0, 0, 0)` for `ColorIndex.BLACK`.
                rÂ   rÝ   rk   NzUnsupported input type: )
r­   r½   r&   r   rå   Ú	to_floatsr3  r   rý   r5  )
r¨  Úfinal_colorÚcolor_indexÚ	rgb_colorÚredÚgreenÚblueÚcolor_tupleÚrgbrò   s
             rb   Úconvert_colorz0ExportSVG._Layer.__init__.<locals>.convert_colors  sI  € ðB "Ø)œ×)Õ)ä&+¨C°°c¸3Ó&?˜ð0 #Ð"ñ/ 5œ�Ñ4ä$+¨K×,=Ñ,=Ó$>˜	Ø+4×+>Ñ+>Ó+@Ñ(˜˜U DÜ&+¨C°¸¸cÓ&B˜ð& #Ð"ñ/ 5ñ
 0œ�Ñ/ä$'¨Ð$5˜	Ø+4×+>Ñ+>Ó+@Ñ(˜˜U DÜ&+¨C°¸¸cÓ&B˜ð #Ð"ñ% 0ñ
 &œ�™à+.¯=©=«?Ñ(˜˜U DÜ&+¨C°¸¸cÓ&B˜ð #Ð"ñ &ñ *œ�Ñ)à&+˜ð #Ð"ñ *ð à&*˜ð #Ð"ð Ü(Ð+CÄDÈÓDUÐCVÐ)WÓXÐXrd   )
r­   r   r&   r3  ro   r¥  r¦  ró   rô   Úelements)rR   ro   r¥  r¦  ró   rô   r³  s          rb   rc   zExportSVG._Layer.__init__k  sg   € ð<#Ü'¬#Ñ-´Ñ5¼Ñ=ÀÑDð<#ä˜‘ó<#ð| ˆDŒIÙ+¨JÓ7ˆDŒOÙ+¨JÓ7ˆDŒOØ*ˆDÔØ&ˆDŒNØ.0ˆD�Mrd   )
re   rf   rg   r—  r­   r   r&   rj   rv   rc   rk   rd   rb   Ú_Layerr¤  j  s[   „ ðK	1àðK	1ð # SÑ(¨5Ñ0°4Ñ7ðK	1ð # SÑ(¨5Ñ0°4Ñ7ð	K	1ð
 ðK	1ð  ôK	1rd   rµ  r3   r   Tr³   Nrñ   ÚscaleÚmarginÚfit_to_strokeÚ	precisionr¥  r¦  ró   rô   Ú
dot_lengthc                 óF  — |t         j                  vr:t        ddj                  t         j                  j	                  «       «      › d�«      ‚|| _        || _        || _        || _        || _	        |
| _
        d| _        i | _        d | _        | j                  d||||	¬«       y )Nz#Invalid unit.  Supported units are z, rl  r   r”  ©ro   r¥  r¦  ró   rô   )rŸ  Ú_UNIT_STRINGrý   ÚjoinÚvaluesrñ   r¶  r·  r¸  r¹  rº  rû   Ú_layersÚ_boundsr  )rR   rñ   r¶  r·  r¸  r¹  r¥  r¦  ró   rô   rº  s              rb   rc   zExportSVG.__init__º  s­   € ð ”y×-Ñ-Ñ-ÜØ5Ø—9‘9œY×3Ñ3×:Ñ:Ó<Ó=Ð>¸aðAóð ð ˆŒ	ØˆŒ
ØˆŒØ*ˆÔØ"ˆŒØ$ˆŒØ'(ˆÔ$Ø46ˆŒØ(,ˆŒð 	�‰ØØ!Ø!Ø#Øð 	õ 	
rd   )r¥  r¦  ró   rô   ro   r×   c                óü   — || j                   v rt        d|› d�«      ‚|j                  t        j                  vrt        d|j                  › d�«      ‚t
        j                  |||||¬«      }|| j                   |<   | S )a¦  add_layer

        Adds a new layer to the SVG export with the given properties.

        Args:
            name (str): The name of the layer. Must be unique among all layers.
            fill_color (ColorIndex |  RGB |  Color |  None, optional): The fill color for shapes
                on this layer. It can be specified as a ColorIndex, an RGB tuple,
                a Color, or None.  Defaults to None.
            line_color (ColorIndex |  RGB |  Color |  None, optional): The line color for shapes on
                this layer. It can be specified as a ColorIndex or an RGB tuple,
                a Color, or None.  Defaults to Export2D.DEFAULT_COLOR_INDEX.
            line_weight (float, optional): The line weight (stroke width) for shapes on
                this layer, in millimeters. Defaults to Export2D.DEFAULT_LINE_WEIGHT.
            line_type (LineType, optional): The line type for shapes on this layer.
                It should be a LineType enum. Defaults to Export2D.DEFAULT_LINE_TYPE.

        Raises:
            ValueError: Duplicate layer name
            ValueError: Unknown linetype

        Returns:
            Self: Drawing with an additional layer
        zDuplicate layer name 'z'.zUnknown linetype `r.  r¼  )rÀ  rý   rå   rÛ   ræ   rŸ  rµ  )rR   ro   r¥  r¦  ró   rô   r  s          rb   r  zExportSVG.add_layerá  s‹   € ðB �4—<‘<ÑÜÐ5°d°V¸2Ð>Ó?Ð?Ø�?‰?¤(×"8Ñ"8Ñ8ÜÐ1°)·/±/Ð1BÀ"ÐEÓFÐFÜ× Ñ ØØ!Ø!Ø#Øð !ó 
ˆð #ˆ�‰�TÑØˆrd   r:   r  Úreverse_wiresc                 óØ   — || j                   vrt        d|› d�«      ‚| j                   |   }t        |t        «      r| j	                  |||«       y|D ]  }| j	                  |||«       Œ y)as  add_shape

        Adds a shape or a collection of shapes to the specified layer.

        Args:
            shape (Shape | Iterable[Shape]): The shape or collection of shapes to be
                  added. It can be a single Shape object or an iterable of Shape objects.
            layer (str, optional): The name of the layer where the shape(s) will be added.
                Defaults to "".
            reverse_wires (bool, optional): A boolean indicating whether the wires of the
                shape(s) should be in reversed direction. Defaults to False.

        Raises:
            ValueError: Undefined layer
        zUndefined layer: rl  N)rÀ  rý   r  r-   r  )rR   r:   r  rÃ  Ú_layerr   s         rb   r!  zExportSVG.add_shape  sk   € ð* ˜Ÿ™Ñ$ÜÐ0°°°qÐ9Ó:Ð:Ø—‘˜eÑ$ˆÜ�eœUÔ#Ø×"Ñ" 5¨&°-Õ@ã�Ø×&Ñ& q¨&°-Õ@ñ rd   c                 ó"  — d| _         |j                  «       }| j                  r| j                  j                  |«      n|| _        g }|j	                  «       }|D ]È  }|j                  «       }|j                  «       }	dt        |	«      k(  r| j                  ||«      }
nt| j                  ||«      }|	D ]%  }| j                  ||«      }|j                  |«       Œ' t        j                  |Ž }t        j                  dd|j                  «       i«      }
|j!                  |
«       ŒÊ g }t#        |j$                  t&        j(                  t&        j*                  ¬«      }|j-                  «       r^|j/                  «       }|j!                  t1        t3        j4                  |«      «      «       |j7                  «        |j-                  «       rŒ^|D ]#  }|j!                  | j                  ||«      «       Œ% g }t#        |j$                  t&        j8                  t&        j(                  ¬«      }|j-                  «       rK|j/                  «       }|j!                  t;        |«      «       |j7                  «        |j-                  «       rŒK|D �cg c]  }| j=                  |«      ‘Œ }}|j                  |«       |j>                  j                  |«       | j                   dkD  r0tA        d«       tA        d«       tA        d| j                   › d�«       y y c c}w )	Nr   ÚpathÚd)ÚToFindÚToAvoidr  r  r  r  )!rû   Úbounding_boxrÁ  r  ÚfacesÚ
outer_wireÚinner_wiresÚlenÚ_wire_elementÚ_wire_segmentsÚextendÚPTÚPathÚETÚElementrÈ  rI   r    r>   r   ÚTopAbs_WIREÚTopAbs_FACEÚMoreÚCurrentr,   r!   ÚWire_sÚNextÚTopAbs_EDGEr+   Ú_edge_elementr´  r  )rR   r:   r  rÃ  Úbbr´  rÌ  ÚfaceÚouterÚinnerÚface_elementÚface_segmentsr‰  ÚsegmentsÚ	face_pathÚloose_wiresÚexplorerÚ	topo_wireÚwireÚloose_edgesÚ	topo_edger&  Úloose_edge_elementss                          rb   r  zExportSVG._add_single_shape0  s‹  € à'(ˆÔ$Ø×ÑÓ!ˆØ/3¯|ª|�t—|‘|×'Ñ'¨Ô+ÀˆŒØˆð —‘“ˆãˆDØ—O‘OÓ%ˆEØ×$Ñ$Ó&ˆEØ”C˜“JŠð  $×1Ñ1°%¸ÓG‘ð
 !%× 3Ñ 3°E¸=Ó I�Û�AØ#×2Ñ2°1°mÓD�HØ!×(Ñ(¨Õ2ð ô ŸG™G ]Ð3�	Ü!Ÿz™z¨&°3¸	¿¹»Ð2FÓG�Ø�O‰O˜LÕ)ð% ð0 ˆÜ"Ø�M‰MÜ#×/Ñ/Ü$×0Ñ0ô
ˆð
 �m‰mŒoØ ×(Ñ(Ó*ˆIØ×Ñœt¤F§M¡M°)Ó$<Ó=Ô>Ø�M‰MŒOð �m‰m�oó
  ˆDØ�O‰O˜D×.Ñ.¨t°]ÓCÕDð  ð ˆÜ"Ø�M‰MÜ#×/Ñ/Ü$×0Ñ0ô
ˆð
 �m‰mŒoØ ×(Ñ(Ó*ˆIØ×Ñœt I›Ô/Ø�M‰MŒOð �m‰m�oñ
 EPÓPÁK¸D˜t×1Ñ1°$Õ7ÀKÐÐPØ�‰Ð+Ô,à�‰×Ñ˜hÔ'Ø×'Ñ'¨!Ò+ÜÐEÔFÜÐ9Ô:ÜØ�T×1Ñ1Ð2Ð2UÐVõð ,ùò	 Qs   ÊLrê  Úreversec                 ó  — g }t        | j                  «      }|j                  «       rK|j                  «       }|j	                  t        |«      «       |j                  «        |j                  «       rŒK|r|j                  «        |S r<   )r   r>   rÙ  rÚ  rI   r+   rÜ  rî  )rê  rî  r#  rè  rì  s        rb   Ú_wire_edgeszExportSVG._wire_edges}  se   € ð ˆÜ)¨$¯,©,Ó7ˆØ�m‰mŒoØ ×(Ñ(Ó*ˆIØ�L‰Lœ˜i›Ô)Ø�M‰MŒOð �m‰m�oñ
 Ø�M‰MŒOØˆrd   c                 óŠ   — t         j                  ||«      }g }|D ]%  }| j                  ||«      }|j                  |«       Œ' |S r<   )rŸ  rð  Ú_edge_segmentsrÒ  )rR   rê  rî  r#  Úwire_segmentsr&  Úedge_segmentss          rb   rÑ  zExportSVG._wire_segmentsŽ  sK   € Ü×%Ñ% d¨GÓ4ˆØ+-ˆÛˆDØ ×/Ñ/°°gÓ>ˆMØ× Ñ  Õ/ð ð Ðrd   c                 óB  — t         j                  ||«      }t        |«      dk(  r| j                  |d   «      }|S g }|D ]%  }| j	                  ||«      }|j                  |«       Œ' t        j                  |Ž }t        j                  dd|j                  «       i«      }|S )Nr3   r   rÇ  rÈ  )rŸ  rð  rÏ  rÞ  rò  rÒ  rÓ  rÔ  rÕ  rÖ  rÈ  )	rR   rê  rî  r#  Úwire_elementró  r&  rô  Ú	wire_paths	            rb   rÐ  zExportSVG._wire_element˜  s�   € Ü×%Ñ% d¨GÓ4ˆÜˆu‹:˜Š?Ø×-Ñ-¨e°A©hÓ7ˆLð Ðð 02ˆMÛ�Ø $× 3Ñ 3°D¸'Ó B�Ø×$Ñ$ ]Õ3ð ô Ÿ™ Ð/ˆIÜŸ:™: f¨s°I·K±K³MÐ.BÓCˆLØÐrd   r,  c                 ó¬  ‡ — t        |t        «      r0|j                  «       |j                  «       |j	                  «       f}nVt        |t
        «      r$|j                  |j                  |j                  f}n"t        dt        |«      j                  › d�«      ‚t        ˆ fd„|D «       «      \  }}}|dk7  r‰ xj                  dz  c_
        t        ||«      S )z¨Create a complex point from a gp_Pnt or Vector.
        We are using complex because that is what svgpathtools wants.
        This method also checks for points z != 0.z%Expected `gp_Pnt` or `Vector`.  Got `r.  c              3   óJ   •K  — | ]  }t        |‰j                  «      –— Œ y ­wr<   )r  r¹  )Ú.0r  rR   s     €rb   Ú	<genexpr>z(ExportSVG._path_point.<locals>.<genexpr>³  s   øè ø€ Ð>¹#°Qœ˜a §¡×0¹#ùs   ƒ #r   r3   )r  r   r0  r1  r2  r'   r4  r5  re   r3  rû   Úcomplex)rR   r,  Úxyzr6  r7  r8  s   `     rb   Ú_path_pointzExportSVG._path_point§  s¯   ø€ ô �bœ&Ô!Ø—$‘$“&˜"Ÿ$™$›& "§$¡$£&Ð(‰CÜ˜œFÔ#Ø—$‘$˜Ÿ™˜bŸd™dÐ"‰CäØ7¼¸R»×8IÑ8IÐ7JÈ"ÐMóð ô Ó>¹#Ó>Ó>‰ˆˆ1ˆaØ�Š6Ø×(Ò(¨AÑ-Õ(Ü�q˜!‹}Ðrd   r&  c                 ó,  — |j                  «       }|j                  «       }|j                  «       }|r||fn||f\  }}| j                  |j	                  |«      «      }| j                  |j	                  |«      «      }	t        j                  ||	«      }
|
S r<   )rB  rL  rM  rþ  ÚValuerÓ  ÚLine)rR   r&  rî  rQ  ÚfpÚlpÚu0rW  Úp0Úp1rÏ   s              rb   Ú_line_segmentzExportSVG._line_segmentº  s…   € Ø×!Ñ!Ó#ˆØ×!Ñ!Ó#ˆØ× Ñ Ó"ˆÙ&�B˜‘8¨R°¨H‰ˆˆRØ×Ñ˜eŸk™k¨"›oÓ.ˆØ×Ñ˜eŸk™k¨"›oÓ.ˆÜ—‘˜˜R“ˆØˆrd   c                 ó(   — | j                  ||«      gS r<   )r  ©rR   r&  rî  s      rb   Ú_line_segmentszExportSVG._line_segmentsÄ  s   € Ø×"Ñ" 4¨Ó1Ð2Ð2rd   c           	      óJ  — | j                  |d¬«      }t        j                  dt        |j                  j
                  «      t        |j                  j                  «      t        |j                  j
                  «      t        |j                  j                  «      dœ«      }|S )z0Converts a Line object into an SVG line element.F©rî  Úline)Úx1Úy1Úx2Úy2)r  rÕ  rÖ  r—  rp   ÚrealÚimagrh  )rR   r&  ÚsegmentrÏ   s       rb   Ú_line_elementzExportSVG._line_elementÇ  s|   € à×$Ñ$ T°5Ð$Ó9ˆÜ—‘Øä˜'Ÿ-™-×,Ñ,Ó-Ü˜'Ÿ-™-×,Ñ,Ó-Ü˜'Ÿ+™+×*Ñ*Ó+Ü˜'Ÿ+™+×*Ñ*Ó+ñ	ó
ˆð ˆrd   c           
      ó  — |j                   dk  rt        dd¬«       g S |j                  «       }|j                  «       }|j	                  «       }|j                  «       j                  «       }|j                  «       j                  «       }|j                  «       }|j                  «       }	|	|z
  }
|
t        j                   k  xs |
t        j                  kD  }|j                  «       dkD  |z  }|r|	|fn||	f\  }}| j                  |j                  |«      «      }| j                  |j                  |«      «      }t        ||«      }t        j                   t#        ddd«      j%                  |t#        ddd«      «      «      }|j'                  «       r\| j                  |j                  ||z   dz  «      «      }t)        j*                  |||d||«      t)        j*                  |||d||«      g}|S t)        j*                  ||||||«      g}|S )	Nr/  z@Skipping arc that is too small to export safely (length < 1e-6).r´   ©Ú
stacklevelr   r3   r¯   F)Úlengthr
   rB  rC  rE  rH  rI  rJ  rL  rM  rN  Úpir2  rþ  r   rü  rO  r   rK  rF  rÓ  ÚArc)rR   r&  rî  rQ  rR  rS  rT  rU  r  r  ÚduÚ	large_arcÚsweepr  rW  rp   rh  ÚrotationÚmidwayrÏ   s                       rb   Ú_circle_segmentszExportSVG._circle_segments×  sÈ  € à�;‰;˜ÒÜØRØõð ˆIØ×!Ñ!Ó#ˆØ—‘“ˆØ—‘“ˆØ—‘“×)Ñ)Ó+ˆØ—‘“×(Ñ(Ó*ˆØ×!Ñ!Ó#ˆØ× Ñ Ó"ˆØ�"‰WˆØœ4Ÿ7™7˜(‘]Ò5¨¬T¯W©W©ˆ	Ø—‘“˜a‘ 7Ñ*ˆÙ&�B˜‘8¨R°¨H‰ˆˆRØ× Ñ  §¡¨R£Ó1ˆØ×Ñ˜uŸ{™{¨2›Ó/ˆÜ˜ Ó(ˆÜ—<‘<¤ q¨!¨Q£× <Ñ <¸VÄVÈAÈqÐRSÃ_Ó UÓVˆØ�>‰>ÔØ×%Ñ% e§k¡k°2¸±7¸a±-Ó&@ÓAˆFä—‘�u˜f h°°u¸fÓEÜ—‘�v˜v x°¸¸sÓCðˆFð ˆô —f‘f˜U F¨H°iÀÈÓLÐMˆFØˆrd   c                 óì  — |j                   rœ|j                  «       }|j                  «       }|j                  «       }|j	                  «       }| j                  |«      }t        j                  dt        |j                  «      t        |j                  «      t        |«      dœ«      }|S | j                  |d¬«      }t        j                  |Ž }	t        j                  dd|	j                  «       i«      }|S )z4Converts a Circle object into an SVG circle element.rR  )ÚcxÚcyÚrFr  rÇ  rÈ  )Ú	is_closedrB  rC  rE  rD  rþ  rÕ  rÖ  r—  r  r  r!  rÓ  rÔ  rÈ  )
rR   r&  rQ  rR  rS  r?   ÚcrÏ   ÚarcsrÇ  s
             rb   Ú_circle_elementzExportSVG._circle_elementø  sÁ   € à�>Š>Ø×%Ñ%Ó'ˆEØ—\‘\“^ˆFØ—]‘]“_ˆFØ—_‘_Ó&ˆFØ× Ñ  Ó(ˆAÜ—Z‘ZØ¤ Q§V¡V£´C¸¿¹³KÄcÈ&ÃkÑRóˆFð ˆð ×(Ñ(¨°uÐ(Ó=ˆDÜ—7‘7˜D�>ˆDÜ—Z‘Z ¨¨d¯f©f«h¨Ó8ˆFØˆrd   c           
      ó8  — |j                   dk  rt        dd¬«       g S |j                  «       }|j                  «       }|j	                  «       }|j                  «       }|j                  «       j                  «       }|j                  «       j                  «       }|j                  «       }	|j                  «       }
|
|	z
  }|t        j                   k  xs |t        j                  kD  }|j                  «       dkD  |z  }|r|
|	fn|	|
f\  }}| j                  |j                  |«      «      }| j                  |j                  |«      «      }t!        ||«      }t        j"                  t%        ddd«      j'                  |t%        ddd«      «      «      }|j)                  «       r\| j                  |j                  ||z   dz  «      «      }t+        j,                  |||d||«      t+        j,                  |||d||«      g}|S t+        j,                  ||||||«      g}|S )	Nr/  zDSkipping ellipse that is too small to export safely (length < 1e-6).r´   r  r   r3   r¯   F)r  r
   rB  r^  r_  r`  rH  rI  rJ  rL  rM  rN  r  r2  rþ  r   rü  rO  r   rK  rF  rÓ  r  )rR   r&  rî  rQ  rc  rd  re  rT  rU  r  r  r  r  r  r  rW  rp   rh  rS  r  r   rÏ   s                         rb   Ú_ellipse_segmentszExportSVG._ellipse_segments  sÙ  € à�;‰;˜ÒÜØVØõð ˆIØ×!Ñ!Ó#ˆØ—-‘-“/ˆØ×*Ñ*Ó,ˆØ×*Ñ*Ó,ˆØ—‘“×*Ñ*Ó,ˆØ—‘“×)Ñ)Ó+ˆØ×!Ñ!Ó#ˆØ× Ñ Ó"ˆØ�"‰WˆØœ4Ÿ7™7˜(‘]Ò5¨¬T¯W©W©ˆ	Ø—‘“˜a‘ 7Ñ*ˆÙ&�B˜‘8¨R°¨H‰ˆˆRØ× Ñ  §¡¨R£Ó1ˆØ×Ñ˜uŸ{™{¨2›Ó/ˆÜ˜ |Ó4ˆÜ—<‘<¤ q¨!¨Q£× <Ñ <¸VÄVÈAÈqÐRSÃ_Ó UÓVˆØ�>‰>ÔØ×%Ñ% e§k¡k°2¸±7¸a±-Ó&@ÓAˆFä—‘�u˜f h°°u¸fÓEÜ—‘�v˜v x°¸¸sÓCðˆFð ˆô —f‘f˜U F¨H°iÀÈÓLÐMˆFØˆrd   c                 óœ   — | j                  |d¬«      }t        j                  |Ž }t        j                  dd|j                  «       i«      }|S )z7Converts an Ellipse object into an SVG ellipse element.Fr  rÇ  rÈ  )r+  rÓ  rÔ  rÕ  rÖ  rÈ  )rR   r&  r(  rÇ  rÏ   s        rb   Ú_ellipse_elementzExportSVG._ellipse_element-  sC   € à×%Ñ% d°EÐ%Ó:ˆÜ�w‰w˜ˆ~ˆÜ—‘˜F S¨$¯&©&«( OÓ4ˆØˆrd   c                 ó’  ‡ — |j                  «       }|j                  «       }|j                  «       j                  «       }|j                  «       }|j	                  «       }|j
                  �|j                  €t        d|› d�«      ‚|j                  j
                  j                  «       }|j                  |«       t        |||t        j                  «      }dt        dt        dt        fˆ fd„}	t!        d|j#                  «       dz   «      D �
cg c]  }
 |	|j%                  |
«      |«      ‘Œ }}
|r|j'                  «        |S c c}
w )Nrk  rl  Úbezierrî  r×   c                 óì  •— | j                  «       D �cg c]  }‰j                  |«      ‘Œ c}}|r|j                  «        t        |«      dk(  rt	        j
                  |d   |d   ¬«      }|S t        |«      dk(  r#t	        j                  |d   |d   |d   ¬«      }|S t        |«      dk(  r't	        j                  |d   |d   |d   |d   ¬«      }|S t        d	| j                  «       › d
�«      ‚c c}w )Nr¯   r   r3   )rp   rh  r°   )rp   Úcontrolrh  r±   )rp   Úcontrol1Úcontrol2rh  u   Surprising BÃ©zier of degree Ú!)
rw  rþ  rî  rÏ  rÓ  r  ÚQuadraticBezierÚCubicBezierrý   rt  )r/  rî  r‡  rÏ   rR   s       €rb   Úmake_segmentz1ExportSVG._bspline_segments.<locals>.make_segmentQ  sñ   ø€ Ø.4¯l©l¬nÓ=©n¨�×!Ñ! !Õ$¨nÑ=ˆAÙØ—	‘	”Ü�1‹v˜Š{ÜŸ™ q¨¡t°°1±Ô6�ð ˆMô �Q“˜1’Ü×+Ñ+°!°A±$ÀÀ!ÁÈ!ÈAÉ$ÔO�ð ˆMô �Q“˜1’ÜŸ™Ø˜A™$¨¨1©¸¸!¹À!ÀAÁ$ô�ð
 ˆMô !Ð#@ÀÇÁÃÐ@QÐQRÐ!SÓTÐTùò >s   ”C1r3   )rn  rB  ro  rL  rM  r>   rq  rý   rr  rs  r   rÛ   rá   r   ri   r0   ry  ÚNbArcsr  rî  )rR   r&  rî  r‚  rƒ  rW  rX  r„  Ú	converterr7  r‰  rÏ   s   `           rb   Ú_bspline_segmentszExportSVG._bspline_segments6  s6  ø€ ð �‰Ó ˆð ×#Ñ#Ó%ˆØ—‘“×&Ñ&Ó(ˆØ×#Ñ#Ó%ˆØ×"Ñ"Ó$ˆð �<‰<Ð 4§=¡=Ð#8Ü˜~¨d¨V°1Ð5Ó6Ð6Ø�M‰M×!Ñ!×0Ñ0Ó2ˆØ×Ñ˜Ôô :Ø�B˜œH×9Ñ9ó
ˆ	ð	Ô!1ð 	¼Dð 	Ä[õ 	ô$ ˜1˜i×.Ñ.Ó0°1Ñ4Ô5ó
á5�ñ ˜Ÿ™ qÓ)¨7Õ3Ø5ð 	ð 
ñ Ø�N‰NÔØˆùò
s   ÄEc                 óœ   — | j                  |d¬«      }t        j                  |Ž }t        j                  dd|j                  «       i«      }|S )uP   Converts a BSpline object into an SVG path element representing a BÃ©zier curve.Fr  rÇ  rÈ  )r:  rÓ  rÔ  rÕ  rÖ  rÈ  )rR   r&  rå  rÇ  rÏ   s        rb   Ú_bspline_elementzExportSVG._bspline_elementi  sD   € à×)Ñ)¨$¸Ð)Ó>ˆÜ�w‰w˜Ð!ˆÜ—‘˜F S¨$¯&©&«( OÓ4ˆØˆrd   c                 ó&   — | j                  ||«      S r<   )r:  r	  s      rb   Ú_other_segmentszExportSVG._other_segmentsr  s   € ð ×%Ñ% d¨GÓ4Ð4rd   c                 ó$   — | j                  |«      S r<   )r<  )rR   r&  s     rb   Ú_other_elementzExportSVG._other_elementw  s   € ð ×$Ñ$ TÓ*Ð*rd   c                 ó  — |j                   €t        d|› d�«      ‚|j                   j                  «       t        j                  k(  }|j
                  }| j                  j                  |t        j                  «      } || |||z  «      }|S )Nrk  rl  )
r>   rý   ÚOrientationr   ÚTopAbs_REVERSEDr‘  Ú_SEGMENT_LOOKUPr  rŸ  r>  )rR   r&  rî  Úedge_reversedr‘  rå  rÏ   s          rb   rò  zExportSVG._edge_segments…  s}   € Ø�<‰<ÐÜ˜~¨d¨V°1Ð5Ó6Ð6ØŸ™×0Ñ0Ó2Ô6H×6XÑ6XÑXˆØ—N‘Nˆ	Ø×'Ñ'×+Ñ+¨I´y×7PÑ7PÓQˆÙ˜$  g°Ñ&=Ó>ˆØˆrd   c                 ó„   — |j                   }| j                  j                  |t        j                  «      } || |«      }|S r<   )r‘  Ú_ELEMENT_LOOKUPr  rŸ  r@  )rR   r&  r‘  ÚelementrÏ   s        rb   rÞ  zExportSVG._edge_element•  s:   € Ø—N‘Nˆ	Ø×&Ñ&×*Ñ*¨9´i×6NÑ6NÓOˆÙ˜˜tÓ$ˆØˆrd   c           	      óp  — |j                   j                  }t        j                  |   \  }}t	        | j
                  t        «      r| j
                  j                  n| j
                  }t        |«      }t        |«      }t        d|«      D ]9  }||   dk(  sŒ|||<   ||dz
  xx   |dz  z  cc<   ||dz   |z  xx   |dz  z  cc<   Œ; t        j                  | j                     |j                  z  | j                  z  }|dd  D �	cg c]%  }	t        |t!        |	«      z  | j"                  «      › ‘Œ' }
}	|
S c c}	w )Nr   r3   r¯   )rô   rå   rÛ   ræ   r  rº  rÁ   r   rÏ  ry  rŸ  rì   rñ   ró   r¶  r  rÉ   r¹  )rR   r  ÚltnameÚ_r  rÈ  Úplenr‰  ÚltscaleÚerÏ   s              rb   Ú_stroke_dasharrayzExportSVG._stroke_dasharray�  s%  € Ø—‘×&Ñ&ˆÜ×+Ñ+¨FÑ3‰
ˆˆ7ô ˜$Ÿ/™/¬9Ô5ð �O‰O×!Ò!à—‘ð 	
ô
 �w“-ˆÜ�7‹|ˆÜ�q˜$–ˆAØ�q‰z˜Q‹Ø�˜‘
Ø˜˜A™“ ! a¡%Ñ'“Ø˜˜Q™ $™Ó'¨1¨q©5Ñ0Ô'ð	  ô ×'Ñ'¨¯	©	Ñ2°U×5FÑ5FÑFÈÏÉÑSˆØHOÐPQÐPRÉÓTÉÀ1”U˜7¤S¨£VÑ+¨T¯^©^Ó<Ð=Ñ>ÈˆÐTØˆùò Us   Ä*D3r:  c                 óÀ  — dt         d z  dt        t        t        d z  f   fd„}|€i } ||j                  «      \  }}||d<   |�||d<    ||j                  «      \  }}||d<   |r||d<   t        t        j                  | j                  «      | j                  z  }|j                  |z  }	|	› |d<   t        j                  d	|«      }
|j                  r|
j                  d
|j                  «       |j                  t         j"                  ur2| j%                  |«      }|
j                  ddj'                  |«      «       |j(                  D ]  }|
j+                  |«       Œ |
S )Nrò   r×   c                 óÎ   — | �ct        | «      \  }}}}t        |dz  «      t        |dz  «      t        |dz  «      t        |d«      f\  }}}}d|› d|› d|› d�}|dk  r|› nd }||fS y)Néÿ   r°   zrgb(Ú,Ú)r3   )ÚnoneN)r3  Úintr  )rò   r%  ÚgÚbÚar²  Úopacitys          rb   Ú_color_attribsz2ExportSVG._group_for_layer.<locals>._color_attribs·  s…   € ØÐ Ü$ U›|‘��A�q˜!Ü # A¨¡G£¬c°!°c±'«l¼CÀÀCÁ»LÌ%ÐPQÐSTË+ÐV‘��A�q˜!Ø˜Q˜C˜q   1 Q C qÐ)�Ø$%¨¢E˜Q™C¨t�Ø˜W�~Ð%Ø!rd   Úfillzfill-opacityÚstrokezstroke-opacityzstroke-widthrW  Úidzstroke-dasharrayÚ )r&   r3  r—  r¥  r¦  rÙ   r#   ré   rñ   r¶  ró   rÕ  rÖ  ro   Úsetrô   rv   r…   rO  r¾  r´  rI   )rR   r  r:  r[  r\  Úfill_opacityr]  Ústroke_opacityÚlwscaleÚstroke_widthrÏ   Ú
dash_arrayrH  s                rb   Ú_group_for_layerzExportSVG._group_for_layer´  sJ  € ð	"¤%¨$¡,ð 	"´5¼¼cÀD¹j¸Ñ3Ió 	"ð ˆ?ØˆGÙ+¨E×,<Ñ,<Ó=ÑˆˆlØˆ�‰ØÐ#Ø&2ˆG�NÑ#Ù#1°%×2BÑ2BÓ#CÑ ˆ�Ø"ˆ�ÑÙØ(6ˆGÐ$Ñ%Ü'¬¯©°·±Ó;¸d¿j¹jÑHˆØ×(Ñ(¨7Ñ2ˆØ%1 Nˆ�ÑÜ—‘˜C Ó)ˆØ�:Š:Ø�J‰J�t˜UŸZ™ZÔ(à�?‰?¤(×"5Ñ"5Ñ5Ø×/Ñ/°Ó6ˆJØ�J‰JÐ)¨3¯8©8°JÓ+?Ô@à—~”~ˆGØ�M‰M˜'Õ"ð &ð ˆrd   rÇ  c           	      óV  — | j                   }|€t        d«      ‚| j                  }| j                  r2t	        d„ | j
                  j                  «       D «       «      }||dz  z  }|| j                  z  }t        |j                  j                  ­|z
  | j                  «      }t        |j                  j                   |z
  | j                  «      }t        |j                  j                  d|z  z   | j                  «      }t        |j                  j                  d|z  z   | j                  «      }	||||	fD �
cg c]  }
t        |
«      ‘Œ }}
t        || j                  z  | j                  «      }t        |	| j                  z  | j                  «      }| j                  j!                  | j"                  d«      }t%        j&                  d|› |› �|› |› �dj)                  |«      dd	d
œ«      }t%        j&                  ddddœ«      }|j+                  |«       | j
                  j-                  «       D ]4  \  }}|j.                  sŒ| j1                  |«      }|j+                  |«       Œ6 t%        j2                  |«      }t%        j4                  |d«       |j7                  |ddd¬«       yc c}
w )zµwrite

        Writes the SVG data to the specified file path.

        Args:
            path (PathLike |  str |  bytes): The file path where the SVG data will be written.
        NzNo shapes to export.c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr<   )ró   )rú  rÍ   s     rb   rû  z"ExportSVG.write.<locals>.<genexpr>ê  s   è ø€ Ð!OÑ9N°A !§-¥-Ñ9Nùs   ‚r¯   r”  Úsvgr_  z1.1zhttp://www.w3.org/2000/svg)ÚwidthÚheightÚviewBoxrð   ÚxmlnsrW  zscale(1,-1)r  )Ú	transformzstroke-linecapr  zutf-8T)ÚencodingÚxml_declarationÚdefault_namespace)rÁ  rý   r·  r¸  ÚmaxrÀ  r¿  r¶  r  Úminr0  r¹  r1  Úsizer—  r½  r  rñ   rÕ  rÖ  r¾  rI   Úitemsr´  rf  ÚElementTreeÚindentr+  )rR   rÇ  rß  Ú
doc_marginÚmax_line_weightÚview_marginÚ	view_leftÚview_topÚ
view_widthÚview_heightÚfÚview_boxÚ	doc_widthÚ
doc_heightÚdoc_unitri  Úcontainer_grouprK  r  Úlayer_groupÚxmls                        rb   r+  zExportSVG.writeÜ  sA  € ð �\‰\ˆØˆ:ÜÐ3Ó4Ð4Ø—[‘[ˆ
Ø×ÒÜ!Ñ!O¸¿¹×9LÑ9LÔ9NÓ!OÓOˆOØ˜/¨AÑ-Ñ-ˆJØ  4§:¡:Ñ-ˆÜ˜2Ÿ6™6Ÿ8™8˜) kÑ1°4·>±>ÓBˆ	Ü˜"Ÿ&™&Ÿ(™(˜ [Ñ0°$·.±.ÓAˆÜ˜2Ÿ7™7Ÿ9™9 q¨;¡Ñ6¸¿¹ÓGˆ
Ü˜BŸG™GŸI™I¨¨K©Ñ7¸¿¹ÓHˆØ%.°¸*ÀkÑ$RÓSÑ$R˜q”C˜•FÐ$RˆÐSÜ˜* t§z¡zÑ1°4·>±>ÓBˆ	Ü˜;¨¯©Ñ3°T·^±^ÓDˆ
Ø×$Ñ$×(Ñ(¨¯©°BÓ7ˆÜ�j‰jØà%˜; x jÐ1Ø'˜L¨¨
Ð3ØŸ8™8 HÓ-Ø Ø5ñó	
ˆô Ÿ*™*Øà*Ø")ñó
ˆð 	�
‰
�?Ô#àŸ™×*Ñ*Ö,‰HˆAˆuØ�~‹~Ø"×3Ñ3°EÓ:�Ø×&Ñ& {Õ3ð -ô
 �n‰n˜SÓ!ˆÜ
�	‰	�#�tÔà�	‰	�$ ¸$ÐRVˆ	ÕWùòA Ts   Ä7J&)r”  Fr<   )Kre   rf   rg   rh   r   r+   rÕ  rÖ  Ú
_Converterr#   ré   rê   rç   r½  rµ  rÛ   râ   rã   rä   rÁ   rÄ   rj   ri   rV  r­   r   r&   rv   rc   r—  r"   r  r-   r   r!  r  rt   r,   ru  rð  r0   rÑ  rÐ  r   r'   rü  rþ  rÓ  r  r  r
  r  r!  r)  r+  r-  r:  r<  r>  r@  r$   rš  r›  rœ  r�  rD  rò  rG  rÞ  rO  r™  rf  r   r˜  r+  rk   rd   rb   rŸ  rŸ  -  sy  „ ñ/ðd ˜4˜& "§*¡*Ð,Ñ-€Jð
 	�‰�Ø�‰�Ø�‰�ð€L÷L1ñ L1ðd —W‘WØØØ"ØØ6:Ø6>×6RÑ6RØ%×9Ñ9Ø&×8Ñ8Ø(1×(AÑ(Añ#
àð#
ð ð#
ð ð	#
ð
 ð#
ð ð#
ð  Ñ$ uÑ,¨tÑ3ð#
ð  Ñ$ uÑ,¨tÑ3ð#
ð ð#
ð ð#
ð  Ñ%ó#
ðV 7;Ø6>×6RÑ6RØ%×9Ñ9Ø&×8Ñ8ò-àð-ð  Ñ$ uÑ,¨tÑ3ð	-ð
  Ñ$ uÑ,¨tÑ3ð-ð ð-ð ð-ð 
ó-ðh Ø#ñ	Aà�x ‘Ñ&ðAð ðAð ó	Að<I uð I°Vð IÈDó IðZ ð˜$ð ¨ð °$°t±*ò ó ðð  4ð °$ð ¸4ÀÑ;Ló ð $ð °ð ¸"¿*¹*ó ð˜f v™oð °'ó ð& $ð °ð ¸"¿'¹'ó ð3 4ð 3°$ð 3¸4ÀÑ;Ló 3ð $ð ¨2¯:©:ó ð  Tð °Dð ¸TÀ+Ñ=Nó ðB Dð ¨R¯Z©Zó ð&  dð  °Tð  ¸dÀ;Ñ>Oó  ðD Tð ¨b¯j©jó ð1 dð 1°Tð 1¸dÀ;Ñ>Oó 1ðf Tð ¨b¯j©jó ð5 Dð 5°4ó 5ð
+ 4ð +¨B¯J©Jó +ð 	�‰�~Ø�‰Ð)Ø×ÑÐ+Ø×ÑÐ+ð	€Oð 4ð °$ð ¸4ÀÑ;Ló ð 	�‰�}Ø�‰˜Ø×ÑÐ*Ø×ÑÐ*ð	€Oð $ð ¨2¯:©:ó ð vó ð0 59ñ$Øð$Ø&*¨T¡kð$à	�‰ó$ðP5X˜( S™.¨5Ñ0ô 5Xrd   rŸ  )]rh   rN  Úxml.etree.ElementTreeÚetreerv  rÕ  r   Úenumr   r   Úosr   r   Útypingr   r	   Úwarningsr
   Úcollections.abcr   r   r   ÚsvgpathtoolsrÓ  r   Úezdxf.colorsr   r   Ú
ezdxf.mathr   ÚOCP.BRepLibr   ÚOCP.BRepToolsr   ÚOCP.Geomr   ÚOCP.GeomConvertr   r   ÚOCP.gpr   r   r   r   r   ÚOCP.HLRAlgor   ÚOCP.HLRBRepr   r   Ú
OCP.TopAbsr   r   Ú
OCP.TopExpr    Ú
OCP.TopoDSr!   Útyping_extensionsr"   Úbuild123d.build_enumsr#   r$   Úbuild123d.geometryr%   r&   r'   r(   Úbuild123d.topologyr)   r*   r+   r,   r-   Úbuild123d.build_commonr/   r  r  r5  r6  r0   Ú__annotations__r2   rm   rv   r­   rÁ   rÐ   rÔ   rj   rÙ   rÛ   rî   rŸ  rk   rd   rb   Ú<module>r¢     s2  ðòó@ ß "Ð "Ý ß ß !ß !Ý ç .ã Û Ý ß %Ý Ý Ý 0Ý %Ý 'Ý Aß 9Õ 9Ý )ß 8ß ;Ý &Ý Ý "ç 0ß CÓ C÷õ õ 3àŸ™ 2§6¡6Ñ)¨B×,>Ñ,>Ñ>ÀÇÁÑO€ˆYÓ OØ R÷C9ñ C9ôT�4ô ô+2ˆ|ô +2ô\�ô ô;�ô ;òòð Tð °Dð ¸Uó ÷qñ qôpb%�ô b%ôTdX�õ dXrd   