
    ji!                     x    d dl ZddlmZmZ ddlmZ ddlmZ ddlm	Z	m
Z
 	 ddZdd	Zd
 ZddZ	 	 	 	 	 	 ddZy)    N   )transformationsutil)plane_transform   )arc)ArcLinec           	         ddl m} |/t        j                  dt        j                  dz  |dz         dd }nCt        |t              st        |t              rt        j                  d||      }nt        d      |ddg}t        j                  t        j                  |      t        j                  |      f      | z  }g }	g }
|D ]v  }t        j                  dt        j                  g||	      }|
j                  t        t        j                   d
      t#        |	      z   d             |	j%                  |       x t        j&                  |	      |z   }	 |d|
|	d|}|S )a
  
    Create a Path2D representing a circle pattern.

    Parameters
    ------------
    pattern_radius : float
      Radius of circle centers
    circle_radius : float
      The radius of each circle
    count : int
      Number of circles in the pattern
    center : (2,) float
      Center of pattern
    angle :  float
      If defined pattern will span this angle
      If None, pattern will be evenly spaced

    Returns
    -------------
    pattern : trimesh.path.Path2D
      Path containing circular pattern
    r   Path2DN               @zangle must be float or int!r   anglescenterradius   Tpointsclosedentitiesvertices )pathr   nplinspacepi
isinstancefloatint
ValueErrorcolumn_stackcossinr   to_threepointappendr	   arangelenextendarray)pattern_radiuscircle_radiuscountr   anglekwargsr   r   centersvertentscircle_centerthreepatterns                 B/DATA/.local/lib/python3.12/site-packages/trimesh/path/creation.pycircle_patternr:   	   s,   2 }S"%%#+uqy9#2>	E5	!Zs%;S%/677~s oorvvf~rvvf~>?.PGDD !!ruu:mM
 	Cryy|c$i7EFE ! 88D>F"D<dT<V<GN    c                 $   ddl m} |ddg}n%t        j                  |t        j                        }t        |       } t        j                  dt        j                  g||       } |dt        t        j                  d      d	      g|d
|}|S )a  
    Create a Path2D containing circle with the specified
    radius.

    Parameters
    --------------
    radius : float
      The radius of the circle
    center : None or (2,) float
      Center of the circle, origin by default
    ** kwargs : dict
      Passed to trimesh.path.Path2D constructor

    Returns
    -------------
    circle : Path2D
      Path containing specified circle
    r   r   r   dtyper   r   r   Tr   r   r   )r   r   r   
asanyarrayfloat64r"   r   r(   r    r	   r*   )r   r   r2   r   r7   results         r9   circlerB   C   s    & ~svRZZ86]F aZvNE RYYq\$785LRF Mr;   c           	      Z   ddl m} t        j                  | t        j                        } | j
                  dk(  r0t        j                  |       dz  }t        j                  | |g      } t        j                  | d      s!t        j                  | d      st        d      g }g }| j                  d      D ]f  \  }}|j                  t        t        j                  d	      d
z  t        |      z                |j!                  ||d   |d   g||d   |d   gg       h  |d||d|}|S )a-  
    Create a Path2D containing a single or multiple rectangles
    with the specified bounds.

    Parameters
    --------------
    bounds : (2, 2) float, or (m, 2, 2) float
      Minimum XY, Maximum XY

    Returns
    -------------
    rect : Path2D
      Path containing specified rectangles
    r   r   r=   )r   r   )r   r   )r   r   r   z"bounds must be (m, 2, 2) or (2, 2)      r   r   r   )r   r   r   r?   r@   shapeabsr-   r   is_shaper$   reshaper)   r
   r*   r+   r,   )	boundsr2   r   halflinesr   lowerupperrects	            r9   	rectanglerP   i   s     ]]64F ||tvvf~#D5$-( MM&&)T]]6:-N=>> EH z2uT299Q<!+s8}<=>q58 4eeAha=QRS 3
 >58>v>DKr;   c                 h   ddl m} g d}t        j                  |dt        j                        j                  d      }|dz  }| Dt        j                  | t        j                        } | j                  d	k7  rt        d
      || z  }|t        j                  ||      }g d} |||         }|S )aC  
    Return a cuboid.

    Parameters
    ------------
    extents : float, or (3,) float
      Edge lengths
    transform: (4, 4) float
      Transformation matrix
    **kwargs:
        passed to Trimesh to create box

    Returns
    ------------
    geometry : trimesh.Path3D
      Path outline of a cuboid geometry
    r   )	load_path)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   C)orderr>   )r   r   g      ?r=   )r   zExtents must be (3,)!)r   r   r   r   r   rE   rD         rE   r   r   rV   rU   r   r   rD   )exchange.loadrR   r   r-   r@   rI   r?   rF   r$   r   transform_points)extents	transformr2   rR   r   indicesoutlines          r9   box_outliner]      s    $ ) XHxx2::>FFwOHOH --rzz:==D 455G "33HiH BG)*GNr;   c                    ddl m} t        |       } t        |      }t	        j
                  d| |dz         dd }|d   }	d}
g }g }|D ]W  }|rt        ||d   z  |z        }t	        j
                  dt        j                  dz  |      }t	        j                  t	        j                  |      t	        j                  |      f      |z  }|j                  |       |j                  t        t	        j                  t        |            |
z                |
t        |      z  }
|j                  |	 |g|	|g|	 | g|	| g||	 g||	g| |	 g| |	gg       d	D ]6  }|j                  t        t	        j                  d      |
z   |z                8 |
t        |d         z  }
Z |j                  d|	gd|	 g|	 dg|	dgg       |j                  t        t	        j                  d      |
z                |j                  t        t	        j                  d      |
z   dz                t	        j                  |      }|.|,|*t        j                  j!                  t#        ||
            }t	        j                  |t	        j$                  t        |            f      }|t'        j(                  ||      } |||      }|S )a  
    Create a Path3D for a grid visualization of a plane.

    Parameters
    -----------
    side : float
      Length of half of a grid side
    count : int
      Number of grid lines per grid half
    transform : None or (4, 4) float
      Transformation matrix to move grid location.
      Takes precedence over plane_origin if both are passed.
    plane_origin : None or (3,) float
      Plane origin
    plane_normal : None or (3,) float
      Unit normal vector
    include_circle : bool
      Include a circular pattern inside the grid
    sections_circle : int
      How many sections should the smallest circle have

    Returns
    ----------
    grid : trimesh.path.Path3D
      Path containing grid plane visualization
    r   )Path3Dr   Nr   r   r   )r   )r   r   rE   rV   )originnormal)matrixr   )r   r_   r"   r#   r   r   r    r%   r&   r'   r)   r
   r*   r+   vstacklinalginvr   zerosr   rX   )sider0   rZ   plane_originplane_normalinclude_circlesections_circler_   radiirmaxcurrentr   r   r
circle_resthetarB   i	grid_paths                      r9   gridrt      s   F  ;DJEKKT519-ab1E9D GHHa%(lo=>JKKRUUQY
;E__bffUmRVVE]%CDqHFOOF#OOD		#f+(>(HIJs6{"G
q	r
TE
D	dUT
		
 AOOD		!w(>(BCD 3x|$$9 > OOaYTE
dUAJq	BCOOD		!w 678OOD		!w 6 :;<yy"H \5,:RIIMM<E
	
 "((3x=*ABCH"33HYO8<Ir;   )NN)N)rD   NNNT    )numpyr    r   r   geometryr   r   r   r	   r
   r:   rB   rP   r]   rt   r   r;   r9   <module>ry      sL     $ &   >B7t#L*Z(Z er;   