
    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 DXFz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                                    F/DATA/.local/lib/python3.12/site-packages/trimesh/path/exchange/dxf.pyload_dxfr   6   s   $ --/CsH s8==./25%&DEE **WX*6C c(..
Ckk#r"((*002G xxs+,44W=H88CNN7+,44W=D ZZQT
h./2F H ::d1a4jH45a8L
<1BOOFLODE
<?Z8 "$
JC Ke4E .3&s+
$ ?KFCKd3E}!HSMVOE
"$.u$5! ? ("II9: ::d1a4jJ67:1=L=>JFZ0A6L<7l#:	@**T!Q$Z8%;<Q?BKrv{CDIk)4J%k)<NZC>%A$F$FA$F$NOPQRJ F		#j/(BJO!1"5)>%+@d"JAq$ 1vz()1vt P *\*%xZ'HQWHh
 #hOFM %  	@II/$?	@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	1QRUX3q64--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    
 	LCMBIIaL$@LDGLMHHqw$(1T7AdG*<=RZZ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HHagqw'(//

;aeA6NH		!4dNd1g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HHagqw'rzz: JJrxx4!D' 2"**EF aeAa@Y3x=299Q<#?YQUVWQX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 rt        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 AI5#agaj/A"5	IIueBQi01E 19HHQtWBJJ7E**U1a4[D01!4C**U1a4[D01!4Cswwy&kfS1I 5IDAq CM)  OOAOOA 	VBIIc%j$9CM$IVX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'1T7!34;;BJJG4!((4 v;!OODPH		!(DPQPQOOF#
 q	F2J 67#))C 	 yy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||~	1T7^F	JJuQtW~.E
 1T7AdG,BJJ?266%="&&-888$	23q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aeeD#&'155s+QUU4-=>bjjQ!%%c*AEE$,<=RZZP BAOOAFFH%RL3x=0	  	B$$F"**U:KSX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!     !P0@1AaDCK!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!     F2E$!QQCr!+2Es   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1Ji(K 		#d) 4jAu:>UAhqk --!!P	%0@!PP
'/z'B1'Ej!!$
 *$U}H!kX&=OODK(!kX&=HH(12,G,Qqw$0,GrzzZEIx{"8A;t,- N	IIueBQi&89E (2@2tq!dai2@I HH,5h,?M,?DAq419qw,?MjjE
 #5IFB CM)  OOBOOBHF" !I #5k!Q$/IadOHT)_-
 G#%k2OGV!%.K;J&$)$e Bf ;!		'..		F+2C2C2E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(      
+T41aqe2a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    . vRZZ8f%GG		#e*BHH5==gFE HHc%j!_BHH=E!RaR%LE!RaR%LE 
+.u}}R/@%--PRBS+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
OCR(

 67# MM&,,7D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 &vTUKX#VVX 4,-V(&!((04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    zz(UzK3v;!YYvs+F=6==vF&T*++::#DL DL $$D7077DKK9PQQD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&     M9LAQqEAd8,9Lr  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 =3v||#44<<fllKCRP !aSUVX==%/)D  		MVV9LMM6"  fll+fmm,
	
 ,)$++3d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zz#))H"56G HHS*-VGHV-VG_ 	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    
 FH--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
13q6Q;
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7H*X2 D.#J,. "% !"K It{{35Aw"uK'?;)D)!T]];AACI9~!  +II4d; 4 99Y'L *-UBIIdkk!nc4R)ST)SAgaSM1)SDTKKc%4;;q>SV9W.XY.Xda71#!.XYZ"&&tzz15DN)"))1D1779:HOOHZ(///FLLNOOOHX&,,./ 99X&&z37D
zzs4y)E
Q1$$$3cc
3333GK9 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,                  rd
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  rt        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   gh㈵>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 MM%rzz2E MM%rzz2Eirxx8I 
	B"IE"I  5zQ		#e*%+(+,h IIes"E
//9i!m4
5Cs5z 3q!t9c!Q$i 00F YY^^F^+F 88
#f+!678
Va !I-D
 <<QU$D SzA&H slbffUS[11F bffUQY'&00F OO	s1a4y	8dV^^G-D&DDeCPQSTPTIFVWgj 
 zz$3895az!}))59{{266%="&&*=>>>5:;Uz!}++U;{{;v777 RhH
L299Q<#h-#?L8LM
#  	E
Q#e*$##BIIc%j$9: --bggc*BLL
H OODQ		!s8}(DQQROOE(O0023
 xx

3H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    
BJJtAqDzU23A6q9A=> Aw$	tAw<   
  	7N	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?