
    Tii!                     z    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dS )    N   )transformationsutil)plane_transform   )arc)ArcLinec           	         ddl m} |/t          j        dt          j        dz  |dz             dd         }nPt          |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 ]}t          j        dt          j        g||	          }|
                    t          t          j        d
          t#          |	          z   d                     |	                    |           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                 O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trimesh/path/creation.pycircle_patternr:   	   s~   2 }S"%#+uqy99#2#>	E5	!	! 8Zs%;%; 8S%//6777~s orvf~~rvf~~>??.PGDD   !ru:mM
 
 
 	Cry||c$ii7EEEFFFE 8D>>F"Df<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   Nr   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vRZ8886]]F aZvNNNEV RYq\\$77785 LR F Mr;   c           	         ddl m} t          j        | t          j                  } | j        dk    r.t          j        |           dz  }t          j        | |g          } t          j	        | d          s$t          j	        | d          st          d          g }g }|                     d          D ]\  }}|                    t          t          j        d	          d
z  t          |          z                        |                    ||d         |d         g||d         |d         gg            |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   sX     ]6444F |tvf~~#D5$-(( M&&)) ?T]6:-N-N ?=>>> EH z22 T TuT29Q<<!+s8}}<==>>>q58 4eeAha=QRSSSS 6>58>>v>>DKr;   c                 f   ddl m} g d}t          j        |dt          j                                      d          }|dz  }| ?t          j        | t          j        	          } | j        d
k    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      ?Nr=   )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WWHx2:>>>FFwOOHOH -rz:::=D  4555G "3HiHH BAAGi)**GNr;   rD   T    c                    ddl m} t          |           } t          |          }t	          j        d| |dz             dd         }|d         }	d}
g }g }|D ]y}|rt          ||d         z  |z            }t	          j        dt          j        dz  |          }t	          j        t	          j        |          t	          j	        |          f          |z  }|
                    |           |
                    t          t	          j        t          |                    |
z                        |
t          |          z  }
|
                    |	 |g|	|g|	 | g|	| g||	 g||	g| |	 g| |	gg           d	D ]=}|
                    t          t	          j        d          |
z   |z                        >|
t          |d                   z  }
{|
                    d|	gd|	 g|	 dg|	dgg           |
                    t          t	          j        d          |
z                        |
                    t          t	          j        d          |
z   dz                        t	          j        |          }|2|0|.t          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   gridru      s   F  ;;DJJEKT519--abb1E9D GHH % % 
	#a%(lo=>>JKRUQY
;;E_bfUmmRVE]]%CDDqHFOOF###OOD	#f++(>(>(HIIIJJJs6{{"G
q	r
TE
D	dUT
		
 	
 	
  	E 	EAOOD	!w(>(BCCCDDDD3x|$$$ OOaYTE
dUAJq	BCCCOOD	!w 6777888OOD	!w 6 :;;;<<<y""H \5,:RIMM<EEE
 
	
 "(3x==*A*ABCCH"3HYOOO8<<<Ir;   )NN)N)rD   NNNTr^   )numpyr    r   r   geometryr   r   r   r	   r
   r:   rB   rP   r]   ru   r   r;   r9   <module>ry      s        $ $ $ $ $ $ $ $ & & & & & &               >B7 7 7 7t# # # #L* * *Z( ( ( (Z e e e e e er;   