Ë
    :vžjj�  ã                   óŠ  — d dl mZ d dlZddlmZ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mZmZmZ i dd“d	d“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$d%“d&d'“d(d)“d*d+“d,d-d.d/œ¥Zej/                  «       D � �ci c]  \  } }|| “Œ
 c}} Zd0Zd1Zd2Zd3Zd4Zd5„ Zd;d6„Zd<d7„Z d=d8„Z!d9„ Z"d:eiZ#yc c}} w )>é    )ÚdefaultdictNé   )ÚgroupingÚ	resourcesÚutil)Útransformations)Úlog)Útol_path)Ú
multi_dicté   )Úto_threepoint)ÚArcÚBSplineÚLineÚTexté   ÚinchesÚfeetÚmilesé   Úmillimetersé   Úcentimetersé   Úmetersé   Ú
kilometersé   Úmicroinchesé	   Úmilsé
   Úyardsé   Ú	angstromsé   Ú
nanometersé   Úmicronsé   Ú
decimetersé   Ú
decametersé   Úhectometersé   Ú
gigametersÚAUzlight yearsÚparsecs)é   é   é   z|<^>|é†   zTRIMESH_METADATA:éÈ   ip  c                 óü  — | j                  «       }t        |d«      r5|dd j                  d«      dk7  rt        d«      ‚|j	                  dd¬	«      }t        |«      j                  «       }|j                  d
d«      j                  «       j                  «       }t        j                  t
        j                  |«      «      j                  d«      }t        j                  t
        j                  |«      «      j                  d«      }t        j                  |dd…df   dk(  «      d   }i }t        j                  |dd…df   dk(  «      d   }t        |«      dkD  r�|t        j                  ||d   «         }	||d   |	 }
i |d<   dD ]  \  }}t!        |
||«      }|€Œ||d   |<   Œ dD ]4  \  }}t!        |
|d«      }|€Œ|||<   ||z  }|t"        v sŒ)t"        |   |d<   Œ6 d|vrt%        j&                  d«       t        j                  |dd…df   dk(  «      d   d   }|t        j                  ||«         }d}||| dd…df   }d|v sd|v rÞ	 t        j                  |dd…df   dk(  «      d   d   }|t        j                  ||«         }||| }||| }t        j                  |ddgk(  j)                  d¬«      «      d   }i }t        j*                  t        j,                  t        |«      «      |«      D ]0  }	 t/        ||   ||   d¬«      \  }}}t        |«      dkD  r||f||<   Œ2 	 t/        ||| ||| |¬!«      \  }}|||d"œ}|S # t0        $ r Y Œ^w xY w# t0        $ r t%        j2                  dd¬ «       Y ŒPw xY w)#a  
    Load a DXF file to a dictionary containing vertices and
    entities.

    Parameters
    ----------
    file_obj: file or file- like object (has object.read method)

    Returns
    ----------
    result: dict, keys are  entities, vertices and metadata
    ÚdecodeNé   s   AutoCAD Binary DXFéÿÿÿÿzBinary DXF is not supported!zutf-8Úignore©ÚerrorsÚ Ú )r<   r   r   ÚENDSECr   ÚHEADERÚ
DXF_HEADER))z$ACADVERÚ1)z	$DIMSCALEÚ40)z$DIMALTÚ70)z$DIMALTFrF   )z$DIMUNITrG   )ú	$INSUNITSrG   )ú$LUNITSrG   ))r<   rI   )r   rH   rG   Úunitsz!DXF doesn't have units specified!ÚENTITIESÚINSERTÚBLOCKÚBLOCKSÚ0©ÚaxisT)Úreturn_namezfailed to parse blocks!©Úexc_info)Úblocks)ÚverticesÚentitiesÚmetadata)ÚreadÚhasattrÚfindÚNotImplementedErrorr:   ÚstrÚstripÚreplaceÚupperÚnpÚarrayÚ
splitlinesÚreshapeÚnonzeroÚlenÚsearchsortedÚget_keyÚ
_DXF_UNITSr	   ÚdebugÚallÚarray_splitÚarangeÚconvert_entitiesÚBaseExceptionÚerror) Úfile_objÚkwargsÚrawÚcleanedÚblob_rawÚblobÚendsecrX   Úheader_startÚ
header_endÚheader_blobÚkeyÚgroupÚvalueÚoffsetrJ   Úentity_startÚ
entity_endrU   Úcheck_entityÚblock_startÚ	block_endÚ
blob_blockÚblob_block_rawÚ
block_inflÚindexÚvÚeÚnamerV   rW   Úresults                                    új/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/path/exchange/dxf.pyÚload_dxfr�   6   sµ  € ð$ �-‰-‹/€Cäˆs�HÔð ˆs�ˆ8�=‰=Ð.Ó/°2Ò5ä%Ð&DÓEÐEð —*‘*˜W¨X�*Ó6ˆCô ˆc‹(�.‰.Ó
€Cà�k‰k˜#˜rÓ"×(Ñ(Ó*×0Ñ0Ó2€Gô �x‰xœŸ™ sÓ+Ó,×4Ñ4°WÓ=€Hä�8‰8”C—N‘N 7Ó+Ó,×4Ñ4°WÓ=€Dô �Z‰Z˜šQ ˜T™
 hÑ.Ó/°Ñ2€Fð €Hô —:‘:˜d¢1 a 4™j¨HÑ4Ó5°aÑ8€LÜ
ˆ<Ó˜1ÒØœBŸO™O¨F°LÀ±OÓDÑEˆ
Ø˜<¨™?¨ZÐ8ˆð "$ˆ�Ñó
‰JˆC�ô ˜K¨¨eÓ4ˆEØÑ Ø.3�˜Ñ& sÒ+ð
ó$ ?‰KˆF�Cä˜K¨¨dÓ3ˆEàˆ}ØØ!ˆH�S‰MØ�V‰OˆEàœ
Ò"Ü$.¨uÑ$5�˜Ò!ð ?ð ˜(Ñ"Ü�I‰IÐ9Ô:ô —:‘:˜d¢1 a 4™j¨JÑ6Ó7¸Ñ:¸1Ñ=€LØœŸ™¨°Ó=Ñ>€Jà€FØ˜ ZÐ0²°A°Ñ6€Là�<Ñ 7¨lÑ#:ð	@äŸ*™* Tª!¨Q¨$¡Z°8Ñ%;Ó<¸QÑ?ÀÑBˆKØœrŸ™¨v°{ÓCÑDˆIà˜k¨)Ð4ˆJØ% k°)Ð<ˆNÜŸ™ Z°C¸°>Ñ%A×$FÑ$FÈAÐ$FÓ$NÓOÐPQÑRˆJð ˆFÜŸ™¬¯	©	´#°j³/Ó(BÀJÖO�ðÜ!1Ø" 5Ñ)¨>¸%Ñ+@Èdô"‘J�A�q˜$ô ˜1“v ’zØ()¨1 v˜˜t™øñ Pô *Øˆ\˜*Ð% x°¸ZÐ'HÐQWôÑ€Hˆhð
 #°ÀhÑO€Fà€Møô %ò Ùðûäò 	@Ü�I‰IÐ/¸$×?ð	@ús7   ÉB,M Ë:-M	Ì'M Í		MÍM ÍMÍM Í M;Í:M;c                 óf  ‡‡ ‡!‡"‡#— |€| }d„ Š"ˆ!ˆ"ˆ#fd„}ˆ!ˆ"ˆ#fd„}ˆ!ˆ"ˆ#fd„}ˆ ˆ!ˆ"ˆ#fd„}ˆ!ˆ"ˆ#fd„}ˆ!ˆ#fd„}	ˆˆ!ˆ#fd	„}
t         |ft        |ft         |ft         |ft        |ft         |
ft         |
fd
œ}g Š#g Š!d}t        j                  | dd…df   dk(  «      d   }t	        d„ «      }t        j
                  t        j                  t        | «      «      |«      D �]g  }t        |«      dk  rŒ| |   Š ‰ d   d   }|dv r-	 t        d„ t        ‰ «      D «       «      }||   |   d   ‰ |   d<   |dk(  rt        ‰ «      g}Œc|� |dk(  r|j                  t        ‰ «      «       Œ…|��}|dk(  �rwt        j                  |dd D �cg c]  }|d   |d   g‘Œ c}t        j                  ¬«      }d}d|d   v r;t        |d   d   «      }t        |dz  «      }|rt        j                   ||dd f«      }t        j                  t        |«      D ��cg c]  \  }}d|v sŒ|‘Œ c}}t        j"                  ¬«      }t        j                  t        |«      D ��cg c]  \  }}d|v sŒt%        |d   «      ‘Œ c}}t        j                  ¬«      }t'        ||||¬«      \  }}|D ]   }|xj(                  t        ‰#«      z  c_        Œ" ‰#j+                  |«       ‰!j+                  |«       d}�Œ|dk(  r,||   }| |   dd…df   |dd…df<   	  |	t        |«      «       �Œ6||v r||   \  }} |‰ «      } ||«       �ŒT|dk7  s�Œ[||xx   dz  cc<   �Œj t        |«      dkD  rHt/        j0                  d j3                  d!j5                  d"„ |j7                  «       D «       «      «      «       t9        j:                  ‰#«      j=                  t        j                  «      Š#|r|| dd…df   d#k(     d   d   }‰#‰!|fS ‰#‰!fS # t        $ r Y �ŒÎw xY wc c}w c c}}w c c}}w # t,        $ r t/        j0                  dd¬«       Y �ŒWw xY w)$av  
    Convert a chunk of entities into trimesh entities.

    Parameters
    ------------
    blob : (n, 2) str
      Blob of entities uppercased
    blob_raw : (n, 2) str
      Blob of entities not uppercased
    blocks : None or dict
      Blocks referenced by INSERT entities
    return_name : bool
      If True return the first '2' value

    Returns
    ----------
    Nc                 óž   — dddœ}| j                  «       D ��ci c]&  \  }}||v sŒ||   t        j                  |«      d   “Œ( }}}|S c c}}w )zJ
        Pull metadata based on group code, and return as a dict.
        ÚlayerrŠ   )Ú8Ú2r   )Úitemsr   Úmake_sequence)r‰   ÚgetÚkrˆ   Úrenameds        rŒ   Úinfozconvert_entities.<locals>.infoÎ   s[   € ð  &Ñ)ˆð ABÇÁÄ	ÔVÁ	¹¸¸1ÈQÐRUÊX�3�q‘6œ4×-Ñ-¨aÓ0°Ñ3Ñ3À	ˆÑVØˆùó Ws
   ™A	¦A	c           
      ó  •— ‰j                  t        d	dt        ‰«      t        j                  d«      z   i ‰| «      ¤Ž«       ‰j                  t        j                  | d   | d   g| d   | d   ggt        j                  ¬«      «       y)
zG
        Convert DXF LINE entities into trimesh Line entities.
        Úpointsr   Ú10Ú20Ú11Ú21©ÚdtypeN© )Úappendr   rf   ra   rm   Úextendrb   Úfloat64)r‰   rW   r˜   rV   s    €€€rŒ   Úconvert_linez&convert_entities.<locals>.convert_lineÚ   sp   ø€ ð
 	�‰œÑL¤C¨£M´B·I±I¸a³LÑ$@ÐLÁDÈÃGÑLÔMà�‰Ü�H‰H�q˜‘w  $¡Ð(¨1¨T©7°A°d±GÐ*<Ð=ÄRÇZÁZÔPõ	
ó    c           	      ó\  •— t        | d   «      }t        j                  | d   | d   g«      j                  t        j                  «      }t        |dd |¬«      }‰j                  t        d
t        ‰«      t        j                  d«      z   dd	œ ‰| «      ¤Ž«       ‰j                  |«       y)zJ
        Convert DXF CIRCLE entities into trimesh Circle entities
        rF   r›   rœ   Nr   )ÚcenterÚradiusr   T©rš   Úclosedr¡   )Úfloatra   rb   Úastyper¤   r   r¢   r   rf   rm   r£   )r‰   ÚRÚCrš   rW   r˜   rV   s       €€€rŒ   Úconvert_circlez(convert_entities.<locals>.convert_circleå   s�   ø€ ô �!�D‘'‹NˆÜ�H‰H�a˜‘g˜q ™wÐ'Ó(×/Ñ/´·
±
Ó;ˆÜ a¨¨ e°AÔ6ˆØ�‰ÜÐNœ˜H›¬¯	©	°!«Ñ4¸dÑNÁdÈ1ÃgÑNô	
ð 	�‰˜Õr¦   c           	      óÄ  •— t        | d   «      }t        j                  | d   | d   gt        j                  ¬«      }t        j                  t        j                  | d   | d   gt        j                  ¬«      «      }t        |dd ||¬	«      }‰j                  t        dt        ‰«      t        j                  d
«      z   ddœ ‰| «      ¤Ž«       ‰j                  |«       y)zJ
        Convert DXF ARC entities into into trimesh Arc entities.
        rF   r›   rœ   rŸ   Ú50Ú51Nr   )r¨   r©   Úanglesr   Frª   r¡   )r¬   ra   rb   r¤   Úradiansr   r¢   r   rf   rm   r£   )r‰   r®   r¯   ÚArš   rW   r˜   rV   s        €€€rŒ   Úconvert_arcz%convert_entities.<locals>.convert_arcñ   s´   ø€ ô
 �!�D‘'‹Nˆä�H‰H�a˜‘g˜q ™wÐ'¬r¯z©zÔ:ˆô �J‰J”r—x‘x  4¡¨!¨D©'Ð 2¼"¿*¹*ÔEÓFˆô  a¨¨ e°A¸aÔ@ˆà�‰œÐY¤3 x£=´2·9±9¸Q³<Ñ#?ÈÑYÑQUÐVWÓQXÑYÔZà�‰˜Õr¦   c                 óž  •— t        j                  | d   | d   f«      j                  t         j                  «      } ‰| «      }d| v xr t	        | d   d   «      dz  }|rt        j
                  ||dd f«      }d| v rût        j                  | d   t         j                  ¬«      }t        j                  ‰dd…df   dk(  «      d   }t        j                  ‰dd…df   dk(  «      d   }|s||j                  «       k  }||   }||   }t        j                  ||«      }t        ||||¬	«      \  }	} | D ]   }
|
xj                  t        ‰«      z  c_        Œ" ‰j                  |	«       ‰j                  | «       y‰j                  t        dd
t        j                   t        |«      «      t        ‰«      z   i|¤Ž«       ‰j                  |«       y)zM
        Convert DXF LWPOLYLINE entities into trimesh Line entities.
        r›   rœ   rG   r   r   NÚ42rŸ   ©ÚlinesÚbulgeÚ	bulge_idxÚ	is_closedrš   r¡   )ra   Úcolumn_stackr­   r¤   ÚintÚvstackrb   re   Úmaxrg   Úbulge_to_arcsrš   rf   r£   r¢   r   rm   )r‰   r»   Úpolyinfor¾   r¼   ÚvidÚbidÚbid_okr½   rˆ   ÚiÚchunkrW   r˜   rV   s              €€€€rŒ   Úconvert_polylinez*convert_entities.<locals>.convert_polyline  s›  ø€ ô
 —‘  4¡¨!¨D©'Ð 2Ó3×:Ñ:¼2¿:¹:ÓFˆñ ˜“7ˆð ˜A�IÒ5¤# a¨¡g¨a¡j£/°AÑ"5ˆ	ÙÜ—I‘I˜u e¨B¨Q iÐ0Ó1ˆEð �1‰9ä—H‘H˜Q˜t™W¬B¯J©JÔ7ˆEä—*‘*˜U¢1 a 4™[¨DÑ0Ó1°!Ñ4ˆCä—*‘*˜U¢1 a 4™[¨DÑ0Ó1°!Ñ4ˆCáØ˜sŸw™w›y™�Ø˜&‘k�Ø˜f™�äŸ™¨¨SÓ1ˆIä Ø 5°IÈô‰DˆAˆqó �à—’œC ›MÑ)–ð ð �O‰O˜AÔØ�O‰O˜AÔàð 	�‰œÑV¤B§I¡I¬c°%«jÓ$9¼CÀ»MÑ$IÐVÈXÑVÔWØ�‰˜Õr¦   c           
      óÒ  •— t        j                  | d   | d   f«      j                  t         j                  «      }t        j                  | d   «      j                  t         j                  «      }t        |«      dk(  rS‰j                  t        d
dt        ‰«      t        j                  d«      z   i ‰| «      ¤Ž«       ‰j                  |«       yt         j                  j                  |d   |d   z
  «      t        j                  k  }‰j                  t        d
t        j                  t        |«      «      t        ‰«      z   ||d	œ ‰| «      ¤Ž«       ‰j                  |«       y)zL
        Convert DXF Spline entities into trimesh BSpline entities.
        r›   rœ   rF   r   rš   Nr   r<   )rš   Úknotsr«   r¡   )ra   r¿   r­   r¤   rb   rf   r¢   r   rm   r£   ÚlinalgÚnormÚtolÚmerger   )r‰   rš   rÌ   r«   rW   r˜   rV   s       €€€rŒ   Úconvert_bsplinez)convert_entities.<locals>.convert_bspline7  s  ø€ ô —‘ ! D¡'¨1¨T©7Ð!3Ó4×;Ñ;¼B¿J¹JÓGˆÜ—‘˜˜4™Ó!×(Ñ(¬¯©Ó4ˆô ˆv‹;˜!Òà�O‰OœDÑP¬¨H«¼¿	¹	À!»Ñ(DÐPÉÈQËÑPÔQà�O‰O˜FÔ#Øô
 —‘—‘  q¡	¨F°2©JÑ 6Ó7¼#¿)¹)ÑCˆð 	�‰Üð Ü—y‘y¤ V£Ó-´°H³Ñ=ØØññ �q“'ñ	ô	
ð 	�‰˜Õr¦   c           	      ó†  •— | d   j                  «       }	 t        | d   «      }	 t        j                  t        | d   «      «      }t        j
                  | d   | d   gt        j                  ¬«      }|t        j                  |«      t        j                  |«      gz   }d	d	g}	 g d
¢t        | d   «         |d<   ‰j                  t        t        ‰«      t        ‰«      dz   |||¬«      «       ‰j                  |«       ‰j                  |«       y# t        $ r d}Y Œûw xY w# t        $ r d}Y Œêw xY w# t        $ r Y Œ„w xY w)zF
        Convert a DXF TEXT entity into a native text entity.
        rE   rF   Nr²   ç        r›   rœ   rŸ   r¨   )Úleftr¨   ÚrightÚ72r   r   )ÚoriginÚvectorÚheightÚtextÚalign)r^   r¬   ro   ra   rµ   rb   r¤   ÚcosÚsinrÀ   r¢   r   rf   )	r‰   rÚ   rÙ   Úangler×   rØ   rÛ   rW   rV   s	          €€rŒ   Úconvert_textz&convert_entities.<locals>.convert_textZ  s2  ø€ ð
 �‰v�|‰|‹~ˆð	Ü˜1˜T™7“^ˆFð	ä—J‘Jœu Q t¡W›~Ó.ˆEô
 —‘˜1˜T™7 A d¡GÐ,´B·J±JÔ?ˆàœ2Ÿ6™6 %›=¬"¯&©&°«-Ð8Ñ8ˆà˜8Ð$ˆð	Ú2´3°q¸±w³<Ñ@ˆE�!‰Hð 	�‰ÜÜ˜8“}Ü˜8“} qÑ(ØØØôô	
ð 	�‰˜ÔØ�‰˜Õøô= ò 	ØŠFð	ûô
 ò 	àŠEð	ûô ò 	Ùð	ús4   –D ¥!D# Â%D4 ÄD ÄD Ä#D1Ä0D1Ä4	E Ä?E c                 ó¬  •— ‰€y| d   }|‰vryt        | j                  dd«      «      }t        j                  | j                  dd«      | j                  dd«      gt        j                  ¬«      }t        j                  | j                  dd	«      | j                  d
d	«      gt        j                  ¬«      }‰|   \  }}|D ]B  }‰	j                  |j                  «       «       ‰	d   xj                  t        ‰
«      z  c_        ŒD ‰
j                  t        j                  |t        j                  |t        j                  |«      |¬«      «      «       y)z„
        Convert an INSERT entity, which inserts a named group of
        entities (i.e. a "BLOCK") at a specific location.
        Nr’   r²   rÓ   r›   rœ   rŸ   Ú41ç      ð?r¹   r<   )r~   ÚthetaÚscale)r¬   r•   ra   rb   r¤   r¢   Úcopyrš   rf   r£   ÚtfÚtransform_pointsÚplanar_matrixrµ   )r‰   rŠ   rÞ   r~   rä   ÚcvÚcerÈ   rU   rW   rV   s           €€€rŒ   Úconvert_insertz(convert_entities.<locals>.convert_insertƒ  s  ø€ ð
 ˆ>Øð �‰vˆà�vÑØä�a—e‘e˜D #Ó&Ó'ˆä—‘˜1Ÿ5™5  sÓ+¨Q¯U©U°4¸Ó-=Ð>ÄbÇjÁjÔQˆä—‘˜!Ÿ%™%  cÓ*¨A¯E©E°$¸Ó,<Ð=ÄRÇZÁZÔPˆð ˜‘‰ˆˆBÛˆAà�O‰O˜AŸF™F›HÔ%à�R‰L×Ò¤3 x£=Ñ0Öð	 ð 	�‰Ü×ÑØ”B×$Ñ$¨F¼"¿*¹*ÀUÓ:KÐSXÔYóõ	
r¦   )ÚLINEÚ
LWPOLYLINEÚARCÚCIRCLEÚSPLINErL   rM   r   rO   c                   ó   — y)Nr   r¡   r¡   r¦   rŒ   Ú<lambda>z"convert_entities.<locals>.<lambda>»  s   €  ar¦   r   )rM   rL   c              3   ó8   K  — | ]  \  }}|d    dk(  sŒ|–— Œ y­w)r   r’   Nr¡   )Ú.0rÈ   rˆ   s      rŒ   Ú	<genexpr>z#convert_entities.<locals>.<genexpr>Ë  s!   è ø€ Ð!PÑ0@©¨¨1ÀAÀaÁDÈCÃK¤!Ñ0@ùs   ‚“ÚPOLYLINEÚVERTEXÚSEQENDr›   rœ   rŸ   FrG   r¹   rº   ÚTEXTzfailed to load text entity!TrS   rK   zskipping dxf entities: {}z, c              3   ó0   K  — | ]  \  }}|› d |› �–— Œ y­w)z: Nr¡   )rô   r–   rˆ   s      rŒ   rõ   z#convert_entities.<locals>.<genexpr>  s!   è ø€ ÐFÑ2E©$¨!¨Q˜Q˜C˜r ! œ+Ñ2Eùs   ‚r’   )Údictr   ra   re   r   rl   rm   rf   ÚnextÚ	enumerateÚStopIterationr¢   rb   r¤   rÀ   ÚboolrÁ   Úint64r¬   rÃ   rš   r£   ro   r	   rj   ÚformatÚjoinr“   r   Úvstack_emptyr­   )$rv   ru   rU   rR   r¥   r°   r·   rÊ   rÑ   rß   rë   ÚloadersÚpolylineÚ
inflectionÚunsupportedr‡   Úentity_typeÚ
index_namerÈ   r»   r¾   Úflagr‰   r½   r¼   ré   rê   Ú	chunk_rawÚchunkerÚloaderÚentity_datarŠ   rÉ   rW   r˜   rV   s$     `                             @@@@rŒ   rn   rn   ¸   sI  ü€ ð& ÐØˆò
ö	
ö
 ö ÷&1öf! õF' öR 
ôJ �|Ð$Ü!Ð#3Ð4Ü�kÐ"Ü˜Ð(Ü˜Ð/Ü˜Ð(Ü˜Ð'ñ€Gð €Hà€Hð €Hä—‘˜D¢ A ™J¨#Ñ-Ó.¨qÑ1€Jä™iÓ(€Kô —‘¤§	¡	¬#¨d«)Ó 4°j×Aˆäˆu‹:˜Š>Øà�U‘ˆà˜A‘h˜q‘kˆð Ð-Ñ-ðÜ!Ñ!P´	¸%Ô0@Ó!PÓP�
Ø'/°¡°zÑ'BÀ1Ñ'E��jÑ! !Ñ$ð
 ˜*Ò$Ü˜U›�}‰HàÐ! k°XÒ&=Ø�O‰OœD ›KÕ(àÑ! k°XÓ&=ä—H‘H¸(À1À2¹,ÓG¹,°Q˜q ™w¨¨$©Ò0¸,ÑGÌrÏzÉzÔZˆEàˆIà�x ‘{Ñ"ä˜8 A™; tÑ,Ó-�ä  ¨¡›N�	ÙÜŸI™I u¨e°B°Q¨iÐ&8Ó9�Eô Ÿ™Ü(¨Ô2Ô@Ñ2‘t�q˜!°d¸a²i’Ð2Ò@ÌÏÉôˆIô —H‘HÜ,5°hÔ,?ÔMÑ,?¡D A qÀ4È1Â9”�q˜‘w•Ð,?ÒMÜ—j‘jôˆEô
 #Ø 5°IÈô‰FˆB�ó �à—’œC ›MÑ)–ð ð �O‰O˜BÔØ�O‰O˜BÔàŠHØ˜FÒ"ð ! ™ˆIð # 5™kª!¨Q¨$Ñ/ˆI’a˜�d‰OðHÙœT )›_Ö-ð
 ˜GÑ#à% kÑ2‰OˆG�Vá! %›.ˆKá�;ÖØ˜JÔ&Ø˜Ó$¨Ñ)Õ$ðe Bôf ˆ;Ó˜!ÒÜ�	‰	Ø'×.Ñ.Ø—	‘	ÑF°+×2CÑ2CÔ2EÓFÓFóô	
ô × Ñ  Ó*×1Ñ1´"·*±*Ó=€HÙØ˜šQ ˜T™
 cÑ)Ñ*¨1Ñ-¨aÑ0ˆØ˜ 4Ð'Ð'à�XÐÐøôa !ò Úðüò Hùó Aùó Nøô2 !ò HÜ—	‘	Ð7À$×GÐGðHúsB   Ã=,O+Å<O;
ÈP ÈP ÉPÉPË;PÏ+	O8Ï7O8Ð P0Ð/P0c           	      óÊ  ‡‡‡‡— t        j                  d«      Šdd„Šd„ Šˆˆˆfd„Šˆˆfd„}ˆˆˆfd„}ˆˆˆfd„}ˆfd„}t        j                  d	¬
«       ‰||||dœ}g }t	        | j
                  | j                  «      D ]€  \  }}	t        |«      j                  }
|�|	|vrŒ"|
|v rE ||
   || j                  «      j                  «       }t        |«      dkD  sŒY|j                  |«       Œkt        j                  d|
«       Œ‚ dj                  |«      }t	        dt        j                  | j                   d   d«      «      D ��ci c]  \  }}d|› �|“Œ }}}|j#                  t	        dt        j                  | j                   d   d«      «      D ��ci c]  \  }}d|› �|“Œ c}}«       t$        j'                  | j(                  d«      |d<    ‰d   j*                  di |¤Žj                  «       g}|j                  ‰d   j+                  |¬«      j                  «       «       |j                  ‰d   j                  «       «       dj                  |«      j-                  t.        d«      }t0        j2                  r\t4        j7                  t5        |«      «      }t        |«      dz  dk(  sJ ‚t9        d„ |ddd…   D «       «      sJ ‚|j;                  d«       |S c c}}w c c}}w ) a1  
    Export a 2D path object to a DXF file.

    Parameters
    ----------
    path : trimesh.path.path.Path2D
      Input geometry to export
    only_layers : None or set
      If passed only export the layers specified

    Returns
    ----------
    export : str
      Path formatted as a DXF file
    ztemplates/dxf.jsonc           	      ó@  — t        j                  | t         j                  ¬«      } t        j                  | «      }|rRt        j
                  t        j                  t        |«      t         j                  ¬«      j                  d«      d«      }n0t        j                  t        |«      dft         j                  ¬«      }|g d¢z  }|r|dd…dd…f   }|dd…dd…f   }dj                  d	„ t        |j                  d
«      |j                  d
«      «      D «       «      }|S )a{  
        Format points into DXF- style point string.

        Parameters
        -----------
        points : (n,2) or (n,3) float
          Points in space
        as_2D : bool
          If True only output 2 points per vertex
        increment : bool
          If True increment group code per point
          Example:
            [[X0, Y0, Z0], [X1, Y1, Z1]]
          Result, new lines replaced with spaces:
            True  -> 10 X0 20 Y0 30 Z0 11 X1 21 Y1 31 Z1
            False -> 10 X0 20 Y0 30 Z0 10 X1 20 Y1 30 Z1

        Returns
        -----------
        packed : str
          Points formatted with group code
        rŸ   ©r<   r   )r   r   r   )r"   r6   é   Nr   Ú
c              3   ó4   K  — | ]  \  }}|d ›d|d›�–— Œ y­w©Údr  ú.12gNr¡   )rô   Úgrˆ   s      rŒ   rõ   z4export_dxf.<locals>.format_points.<locals>.<genexpr>Y  s(   è ø€ ð 
Ù+T¡4 1 aˆq�ˆe�2�a˜�XÔÑ+Tùó   ‚r<   )ra   Ú
asanyarrayr¤   r   Ústack_3DÚtilerm   rf   r   rd   Úzerosr  Úzip)rš   Úas_2DÚ	incrementÚthreer|   Úpackeds         rŒ   Úformat_pointsz!export_dxf.<locals>.format_points3  sã   € ô. —‘˜v¬R¯Z©ZÔ8ˆä—‘˜fÓ%ˆÙÜ—G‘GÜ—	‘	œ#˜e›*¬B¯H©HÔ5×=Ñ=¸gÓFÈó‰Eô —H‘Hœc %›j¨!˜_´B·H±HÔ=ˆEØ’ÑˆáØš!˜R˜a˜R˜%‘LˆEØš!˜R˜a˜R˜%‘LˆEà—‘ñ 
Ü+.¨u¯}©}¸RÓ/@À%Ç-Á-ÐPRÓBSÔ+Tó
ó 
ˆð ˆr¦   c                 ó˜   — ddt        t        | «      «      dd dœ}t        | d«      r"t        j                  | j
                  «      |d<   |S )a  
        Pull layer, color, and name information about an entity

        Parameters
        -----------
        entity : entity object
          Source entity to pull metadata

        Returns
        ----------
        subs : dict
          Has keys 'COLOR', 'LAYER', 'NAME'
        éÿ   r   Nr.   )ÚCOLORÚLAYERÚNAMEr�   r'  )r]   ÚidrZ   r   Úto_asciir�   )ÚentityÚsubss     rŒ   Úentity_infozexport_dxf.<locals>.entity_info_  sJ   € ð  ØÜœ˜6›
“O C RÐ(ñ
ˆô
 �6˜7Ô#ä ŸM™M¨&¯,©,Ó7ˆD�‰MØˆr¦   c                 ó  •— | j                  |«      }t        |«      dk  ry ‰| «      } ‰|dd¬«      |d<   d|d<   t        |«      |d	<   t        t        | j                  «      «      |d
<    ‰d   j
                  di |¤Ž}|S )aB  
        Convert an entity to a discrete polyline

        Parameters
        -------------
        line : entity
          Entity which has 'e.discrete' method
        vertices : (n, 2) float
          Vertices in space

        Returns
        -----------
        as_dxf : str
          Entity exported as a DXF
        r   rA   TF)r  r   ÚPOINTSrí   ÚTYPEÚVCOUNTÚFLAGÚliner¡   )Údiscreterf   rÀ   rÿ   r«   r  )r3  rV   rš   r,  r‹   r-  r#  Útemplates        €€€rŒ   r¥   z export_dxf.<locals>.convert_linex  sŽ   ø€ ð" —‘˜xÓ(ˆäˆv‹;˜!ÒØñ ˜4Ó ˆÙ& v°TÀUÔKˆˆX‰Ø#ˆˆV‰Ü˜V›ˆˆX‰ô œ4 §¡Ó,Ó-ˆˆV‰à(�˜&Ñ!×(Ñ(Ñ0¨4Ñ0ˆØˆr¦   c                 ó®  •— | j                  |dd¬«      } ‰| «      }|j                   }t        |«      dk(  rt        j                  |d«      } dj                  |Ž }|d|j
                  d›�z  }| j                  rd	|d
<   n9d|d
<   |dz  }| dj                  t        j                  |j                  «      Ž z  }||d<    ‰d   j                  di |¤Ž}|S )NTF)Úreturn_angleÚreturn_normalr   rÓ   z 10
{:.12g}
20
{:.12g}
30
{:.12g}z
40
r  rï   r0  rî   z
100
AcDbArcz
50
{:.12g}
51
{:.12g}ÚDATAÚarcr¡   )	r¨   rf   ra   r¢   r  r©   r«   Údegreesr´   )	r:  rV   r˜   r,  r¨   Údatar‹   r-  r5  s	          €€rŒ   r·   zexport_dxf.<locals>.convert_arcš  sä   ø€ à�z‰z˜(°ÀUˆzÓKˆÙ˜3ÓˆØ—‘ˆÜˆv‹;˜!ÒÜ—Y‘Y˜v sÓ+ˆFØ=Ð6×=Ñ=¸vÐFˆØ�&˜Ÿ™ TÐ*Ð+Ñ+ˆà�:Š:Ø#ˆD�ŠLà ˆD�‰Lð Ð$Ñ$ˆDØÐ7Ð0×7Ñ7¼¿¹ÀDÇKÁKÓ9PÐQÑQˆDØˆˆV‰Ø'�˜%‘×'Ñ'Ñ/¨$Ñ/ˆàˆr¦   c                 óì  •—  ‰|| j                      d¬«      } dt        | j                  «      z  j                  | j                  Ž d d }ddddd	d
œ}|d   }| j                  r||d   z  }g d¢}g d¢}dj                  d„ t        ||«      D «       «      } ‰| «      }	|	j                  d|||d|dt        | j                  «      t        | j                   «      dœ	«        ‰d   j                  di |	¤Ž}
|
S )NF©r   z40
{:.12g}
r<   r   r   r   r   r.   )r«   ÚperiodicÚrationalÚplanarÚlinearrA  r«   )rÓ   rÓ   râ   )éÒ   éÜ   éæ   r  c              3   ó4   K  — | ]  \  }}|d ›d|d›�–— Œ y­wr  r¡   )rô   rÈ   Újs      rŒ   rõ   z6export_dxf.<locals>.convert_bspline.<locals>.<genexpr>Á  s&   è ø€ ÐMÑ9L±°°A˜Q˜q˜E  A d 8Ô,Ñ9Lùr  rð   r   r   )	r0  r/  ÚKNOTSÚNORMALÚDEGREEr2  ÚFCOUNTÚKCOUNTÚPCOUNTÚbspliner¡   )rš   rf   rÌ   r  r«   r  r  Úupdate)ÚsplinerV   rš   rÌ   Úflagsr
  ÚnormalÚn_codeÚn_strr,  r‹   r-  r#  r5  s              €€€rŒ   rÑ   z#export_dxf.<locals>.convert_bspline±  s  ø€ á˜x¨¯©Ñ6À%ÔHˆð =�¤3 v§|¡|Ó#4Ñ4×<Ñ<¸f¿l¹lÐKÈCÈRÐPˆð ¨!¸ÀaÐSUÑVˆà�X‰ˆØ�=Š=Ø˜% ™/Ñ)ˆDâ ˆÚ ˆØ—	‘	ÑM¼¸VÀVÔ9LÓMÓMˆá˜6Ó"ˆØ�‰à Ø ØØØØØÜ˜fŸl™lÓ+Ü˜fŸm™mÓ,ñ
ô	
ð ,�˜)Ñ$×+Ñ+Ñ3¨dÑ3ˆàˆr¦   c                 ój  •—  ‰| «      } ‰|| j                   g   d¬«      |d<   t        j                  | j                  |«      «      |d<   | j                  j                  dt        «      j                  dd¬«      j                  d«      |d	<   | j                  |d
<    ‰d   j                  di |¤Ž}|S )z6
        Convert a Text entity to DXF string.
        Fr>  ÚORIGINÚANGLEr@   Úasciir=   r>   rù   ÚHEIGHTrÚ   r¡   )r×   ra   r;  rÞ   rÚ   r_   Ú
_SAFESPACEÚencoder:   rÙ   r  )ÚtxtrV   Úsubr‹   r-  r#  r5  s       €€€rŒ   rß   z export_dxf.<locals>.convert_textÖ  s©   ø€ ñ
 ˜#Óˆá% h°·
±
¨|Ñ&<ÈÔNˆˆH‰ä—z‘z #§)¡)¨HÓ"5Ó6ˆˆG‰ð �H‰H×Ñ˜S¤*Ó-ß‰V�G HˆVÓ-ß‰V�G‹_ð 	ˆF‰ð Ÿ
™
ˆˆH‰Ø(�˜&Ñ!×(Ñ(Ñ/¨3Ñ/ˆØˆr¦   c                 ó   •—  ‰| |«      S )zl
        For entities we don't know how to handle, return their
        discrete form as a polyline
        r¡   )r+  rV   r¥   s     €rŒ   Úconvert_genericz#export_dxf.<locals>.convert_genericì  s   ø€ ñ
 ˜F HÓ-Ð-r¦   r&   )Ú	precision)r   r   r   ÚBezierr   Nr   zEntity type %s not exported!r  ÚXYZrÓ   ÚEXTMIN_r   ÚEXTMAX_ÚLUNITSÚheaderrW   )rK   Úfooterr@   r   c              3   ó8   K  — | ]  }t        |«      d k\  –— Œ y­w)r   N)rÀ   )rô   rÈ   s     rŒ   rõ   zexport_dxf.<locals>.<genexpr>(  s   è ø€ Ð3©
 1”3�q“6˜Q•;©
ùs   ‚rX  )FTr¡   )r   Úget_jsonra   Úset_printoptionsr  rW   ÚlayersÚtypeÚ__name__rV   r^   rf   r¢   r	   rj   r  ÚboundsrO  Ú_UNITS_TO_DXFr•   rJ   r  r_   rZ  rÏ   Ústrictr]   rc   rk   r[  )ÚpathÚonly_layersr·   rÑ   rß   r_  ÚconversionsÚ	collectedr‰   r�   rŠ   Ú	convertedÚentities_strr–   rˆ   ÚhsubÚsectionsrv   r»   r¥   r-  r#  r5  s                      @@@@rŒ   Ú
export_dxfry     s”  û€ ô" ×!Ñ!Ð"6Ó7€Hó*òXö2 õDö.#öJô,.ô ×Ñ "Õ%ð ØØØ!Ø"ñ€Kð €IÜ˜Ÿ™ t§{¡{Ö3‰ˆˆ5Ü�A‹w×ÑˆàÐ" u°KÑ'?ØØ�;ÑØ)˜ DÑ)¨!¨T¯]©]Ó;×AÑAÓCˆIÜ�9‹~ Ó!à× Ñ  Õ+ä�I‰IÐ4°dÕ;ð 4ð —9‘9˜YÓ'€Lô *-¨U´B·I±I¸d¿k¹kÈ!¹nÈcÓ4RÔ)SÔTÑ)S¡  Aˆg�a�SˆM˜1ÑÐ)S€DÑTØ‡K�K¬c°%¼¿¹À4Ç;Á;ÈqÁ>ÐSVÓ9WÔ.XÔYÑ.X¡d a¨�7˜1˜#� Ñ!Ð.XÒYÔZä"×&Ñ& t§z¡z°1Ó5€Dˆ�Nà)�˜Ñ"×)Ñ)Ñ1¨DÑ1×7Ñ7Ó9Ð:€Hà‡O�O�H˜ZÑ(×/Ñ/¸Ð/ÓF×LÑLÓNÔOà‡O�O�H˜XÑ&×,Ñ,Ó.Ô/ð �9‰9�XÓ×&Ñ&¤z°3Ó7€Dä
‡z‚zä—‘œs 4›yÓ)ˆä�E“
˜Q‘ 1Ò$Ð$Ð$äÑ3¨©c°¨cª
Ó3Ô3Ð3Ð3à�‰�GÔà€Kùó9 UùÛYs   ÅKÆK
c                 óL	  — t        j                  | t         j                  ¬«      } t        j                  |t         j                  ¬«      }t        j                  |t         j                  ¬«      }t        j                  |«      dkD  }||   }||   }|€i }t        |«      dk(  r/t        j                  t        | «      «      }t        |fi |¤Žg}| |fS t        j                  |«      dz  }t        j                  ||dz
  f«      }	|r|	t        | «      z  }	| |	dd…df      | |	dd…df      z
  }
t         j                  j                  |
d¬«      }t        j                  t        j                  |
t        j                  t        |
«      «      f«      t        j                  t        |
«      df«      g d	¢z  «      }t        j                   |dd…dd
…f   «      }| |	   j#                  d¬«      }|dz  t        j$                  |dz  «      z  }|t        j&                  |d
z  «      |z  z
  }t        j                  | |	dd…df      |||j)                  d«      z  z   | |	dd…df      f«      j)                  d«      }t*        j,                  r­d
dlm} |D �cg c]  } ||«      j2                  ‘Œ }}t        j4                  t        j                  |«      t        j                  |«      «      sJ ‚|D �cg c]  } ||«      j6                  ‘Œ }}t        j4                  |t        j                  |«      «      sJ ‚g g }}|D ]N  }|j9                  t;        ddt        j                  d«      t        |«      z   i|¤Ž«       |j=                  |«       ŒP t        | «      dz
  t        |«      kD  rÍt        j>                  t        j                  t        | «      «      «      }tA        jB                  |t        jD                  |	d¬«      t         jF                  «      D ]_  }|j9                  t        ddt        j                  d
«      t        |«      z   i|¤Ž«       |j=                  | |   jI                  «       «       Œa t        jJ                  |t         j                  ¬«      }||fS c c}w c c}w )a•  
    Polylines can have "vertex bulge" which means the polyline
    has an arc tangent to segments, rather than meeting at a
    vertex.

    From Autodesk reference:
    The bulge is the tangent of one fourth the included
    angle for an arc segment, made negative if the arc
    goes clockwise from the start point to the endpoint.
    A bulge of 0 indicates a straight segment, and a
    bulge of 1 is a semicircle.

    Parameters
    ----------------
    lines : (n, 2) float
      Polyline vertices in order
    bulge : (m,) float
      Vertex bulge value
    bulge_idx : (m,) float
      Which index of lines is bulge associated with
    is_closed : bool
      Is segment closed
    metadata : None, or dict
      Entity metadata to add

    Returns
    ---------------
    vertices : (a, 2) float
      New vertices for poly-arc
    entities : (b,) entities.Entity
      New entities, either line or arc
    rŸ   gñhãˆµøä>Nr   g      @r   rP   r   )r   r   r   r   g       @r  )r<   r   r   )Ú
arc_centerrš   r¡   )&ra   r  r¤   r   Úabsrf   rm   r   Úarctanr¿   rÍ   rÎ   Úcrossr  Úonesr   ÚunitizeÚmeanrÝ   rÜ   rd   rÏ   rp  r:  r{  ÚspanÚallcloser©   r¢   r   r£   Ústack_linesr   Úboolean_rowsÚsortÚ	setdiff1drå   rb   )r»   r¼   r½   r¾   rX   Úokr‡   rW   rÞ   ÚtidrØ   ÚlengthÚperpÚmidpointr©   r~   r!  r{  rÈ   Úcheck_angleÚcheck_radiirV   Ú
arc_pointsÚexistingÚline_idxs                            rŒ   rÃ   rÃ   /  sÚ  € ôD �M‰M˜%¤r§z¡zÔ2€Eô �M‰M˜%¤r§z¡zÔ2€EÜ—‘˜i¬r¯x©xÔ8€Iô 
�‰�‹˜Ñ	€BØ�"‰I€EØ˜"‘€Ið ÐØˆô ˆ5ƒz�Q‚Ü—	‘	œ#˜e›*Ó%ˆä˜Ñ+ (Ñ+Ð,ˆØ�hˆÐô �I‰I�eÓ˜sÑ"€Eä
�/‰/˜9 i°!¡mÐ4Ó
5€CáØŒs�5‹zÑˆð �3’q˜!�t‘9Ñ  cª!¨Q¨$¡iÑ 0Ñ0€Fô �Y‰Y�^‰^˜F¨ˆ^Ó+€Fô �8‰8Ü
�‰˜¤§¡¬#¨f«+Ó!6Ð7Ó8Ü
�‰”�V“˜aÐ Ó!¢IÑ-ó€Dô
 �<‰<˜šQ   ˜U™Ó$€Dð �S‰z�‰ AˆÓ&€Hð �s‰lœbŸf™f U¨S¡[Ó1Ñ1€Fð ”b—f‘f˜U Q™YÓ'¨&Ñ0Ñ0€Fô �O‰OØ	ˆs’1�a�4‰yÑ	˜8 d¨V¯^©^¸GÓ-DÑ&DÑDÀeÈCÒPQÐSTÐPTÉIÑFVÐWóç�gˆjÓð 
ô ‡z‚zÝ$á38Ó9±5¨a‘z !“}×)Ó)°5ˆÐ9Ü�{‰{œ2Ÿ6™6 %›=¬"¯&©&°Ó*=Ô>Ð>Ð>á5:Ó;±U°‘z !“}×+Ó+°UˆÐ;Ü�{‰{˜;¬¯©¨v«Ô7Ð7Ð7ð ˜Rˆh€Hãˆ
Ø�‰œÑL¤2§9¡9¨Q£<´#°h³-Ñ#?ÐLÀ8ÑLÔMØ�‰˜
Õ#ð ô 	ˆE‹
�Q‰œ#˜e›*Ò$ä×#Ñ#¤B§I¡I¬c°%«jÓ$9Ó:ˆä ×-Ñ-Ø”b—g‘g˜c¨Ô*¬B¯L©Lö
ˆHð �O‰OœDÑQ¬¯	©	°!«´s¸8³}Ñ(DÐQÈÑQÔRØ�O‰O˜E (™O×0Ñ0Ó2Õ3ð
ô �x‰x˜¬¯
©
Ô3€Hà�XÐÐùò; :ùò <s   ÊRË/R!c                 óÐ   — 	 | t        j                  | dd…df   |k(  «      d   d   dz      }|d   |k(  r	 t        |d   «      S y# t        $ r Y yw xY w# t        $ r |d   cY S w xY w)zN
    Given a loaded (n, 2) blob and a field name
    get a value by code.
    Nr   r   )ra   re   Ú
IndexErrorrÀ   Ú
ValueError)rv   ÚfieldÚcoder3  s       rŒ   rh   rh   ±  sˆ   € ð
Ø”B—J‘J˜t¢A q D™z¨UÑ2Ó3°AÑ6°qÑ9¸AÑ=Ñ>ˆð ˆA�w�$‚ð	Ü�t˜A‘w“<Ðð øô ò Ùðûô
 ò 	Ø˜‘7ŠNð	ús"   ‚+A ¶A Á	AÁAÁA%Á$A%Údxf)NNF)N)FN)$Úcollectionsr   Únumpyra   rA   r   r   r   r   ræ   Ú	constantsr	   r
   rÏ   r   r:  r   rW   r   r   r   r   ri   r“   ro  rZ  ÚXRECORD_METADATAÚXRECORD_SENTINELÚXRECORD_MAX_LINEÚXRECORD_MAX_INDEXr�   rn   ry  rÃ   rh   Ú_dxf_loaders)r–   rˆ   s   00rŒ   Ú<module>r      s„  ðÝ #ã ç )Ñ )Ý %Ý Ý (Ý Ý ß /Ó /ðØ€xðà€vðð €wðð €}ð	ð
 €}ðð €xðð €|ðð €}ðð €vðð ˆðð ˆðð ˆðð ˆ	ðð ˆðð ˆðð  ˆð!ð" ˆð#ð$ 	ØØò)€
ð. #-×"2Ñ"2Ô"4Ô5Ñ"4™$˜!˜Q��A‘Ð"4Ò5€ð €
ð Ð ð 'Ð àÐ àÐ òóDeóPLó^òDð& �xÐ �ùó 6s   ÂB?