
    \h              
           S SK Jr  S SKJr  S SKJr  S SKJrJrJ	r	  / SQr
 " S S\\" SSS	/5      5      r " S
 S\5      r " S S\5      rS rS rg)    )ABC)
namedtuple)BodyBase)VectorReferenceFramePoint)LoadBaseForceTorquec                   ,    \ rS rSrSrS rS r\r\rSr	g)r	   	   z2Abstract base class for the various loading types.c                 v    [        SU R                  R                   SUR                  R                   S35      e)Nz$unsupported operand type(s) for +: '' and ''	TypeError	__class____name__selfothers     U/var/www/auris/envauris/lib/python3.13/site-packages/sympy/physics/mechanics/loads.py__add__LoadBase.__add__   @      NN334 5!OO445Q8 9 	9    c                 v    [        SU R                  R                   SUR                  R                   S35      e)Nz$unsupported operand type(s) for *: 'r   r   r   r   s     r   __mul__LoadBase.__mul__   r   r    N)
r   
__module____qualname____firstlineno____doc__r   r   __radd____rmul____static_attributes__r    r   r   r	   r	   	   s    <9
9
 HHr   r	   locationvectorc                   R   ^  \ rS rSrSrU 4S jrS r\S 5       r\S 5       r	Sr
U =r$ )r
      a  Force acting upon a point.

Explanation
===========

A force is a vector that is bound to a line of action. This class stores
both a point, which lies on the line of action, and the vector. A tuple can
also be used, with the location as the first entry and the vector as second
entry.

Examples
========

A force of magnitude 2 along N.x acting on a point Po can be created as
follows:

>>> from sympy.physics.mechanics import Point, ReferenceFrame, Force
>>> N = ReferenceFrame('N')
>>> Po = Point('Po')
>>> Force(Po, 2 * N.x)
(Po, 2*N.x)

If a body is supplied, then the center of mass of that body is used.

>>> from sympy.physics.mechanics import Particle
>>> P = Particle('P', point=Po)
>>> Force(P, 2 * N.x)
(Po, 2*N.x)

c                    > [        U[        5      (       a  UR                  n[        U[        5      (       d  [	        S5      e[        U[
        5      (       d  [	        S5      e[        TU ]  XU5      $ )Nz!Force location should be a Point.z Force vector should be a Vector.)
isinstancer   
masscenterr   r   r   super__new__)clspointforcer   s      r   r0   Force.__new__:   s^    eX&&$$E%''?@@%((>??ws511r   c                 h    U R                   R                   SU R                   SU R                   S3$ )Nz(point=z, force=))r   r   r2   r3   r   s    r   __repr__Force.__repr__C   s6    >>**+74::, ?A' 	(r   c                     U R                   $ Nr(   r7   s    r   r2   Force.pointG       }}r   c                     U R                   $ r;   r)   r7   s    r   r3   Force.forceK       {{r   r    )r   r!   r"   r#   r$   r0   r8   propertyr2   r3   r'   __classcell__r   s   @r   r
   r
      s:    >2(    r   r
   c                   R   ^  \ rS rSrSrU 4S jrS r\S 5       r\S 5       r	Sr
U =r$ )r   P   a  Torque acting upon a frame.

Explanation
===========

A torque is a free vector that is acting on a reference frame, which is
associated with a rigid body. This class stores both the frame and the
vector. A tuple can also be used, with the location as the first item and
the vector as second item.

Examples
========

A torque of magnitude 2 about N.x acting on a frame N can be created as
follows:

>>> from sympy.physics.mechanics import ReferenceFrame, Torque
>>> N = ReferenceFrame('N')
>>> Torque(N, 2 * N.x)
(N, 2*N.x)

If a body is supplied, then the frame fixed to that body is used.

>>> from sympy.physics.mechanics import RigidBody
>>> rb = RigidBody('rb', frame=N)
>>> Torque(rb, 2 * N.x)
(N, 2*N.x)

c                    > [        U[        5      (       a  UR                  n[        U[        5      (       d  [	        S5      e[        U[
        5      (       d  [	        S5      e[        TU ]  XU5      $ )Nz+Torque location should be a ReferenceFrame.z!Torque vector should be a Vector.)r-   r   framer   r   r   r/   r0   )r1   rI   torquer   s      r   r0   Torque.__new__o   s\    eX&&KKE%00IJJ&&))?@@ws622r   c                 h    U R                   R                   SU R                   SU R                   S3$ )Nz(frame=z	, torque=r6   )r   r   rI   rJ   r7   s    r   r8   Torque.__repr__x   s6    >>**+74::, ?++a) 	*r   c                     U R                   $ r;   r<   r7   s    r   rI   Torque.frame|   r>   r   c                     U R                   $ r;   r@   r7   s    r   rJ   Torque.torque   rB   r   r    )r   r!   r"   r#   r$   r0   r8   rC   rI   rJ   r'   rD   rE   s   @r   r   r   P   s:    <3*    r   r   c                     / nU Ha  n[        U[        5      (       d  [        [        U5       S35      eUR	                  [        UR                  UR                  U -  5      5        Mc     U$ )a  
Returns a list of gravity forces given the acceleration
due to gravity and any number of particles or rigidbodies.

Example
=======

>>> from sympy.physics.mechanics import ReferenceFrame, Particle, RigidBody
>>> from sympy.physics.mechanics.loads import gravity
>>> from sympy import symbols
>>> N = ReferenceFrame('N')
>>> g = symbols('g')
>>> P = Particle('P')
>>> B = RigidBody('B')
>>> gravity(g*N.y, P, B)
[(P_masscenter, P_mass*g*N.y),
 (B_masscenter, B_mass*g*N.y)]

z is not a body type)r-   r   r   typeappendr
   r.   mass)accelerationbodiesgravity_forcebodys       r   gravityrZ      sa    * M$))tDzl*=>??U4??DII4LMN  r   c                    [        U [        5      (       a  U $ [        U [        5      (       a  [        U 5      S:w  a  [	        SU  S35      e[        U S   [
        5      (       a  [        U S   U S   5      $ [        U S   [        5      (       a  [        U S   U S   5      $ [	        SU S    S35      e[        S[        U 5       S	35      e)
zBHelper function to parse loads and convert tuples to load objects.   zLoad z should have a length of 2.r      z'Load not recognized. The load location z. should either be a Point or a ReferenceFrame.z
Load type zA not recognized as a load. It should be a Force, Torque or tuple.)r-   r	   tuplelen
ValueErrorr   r
   r   r   r   rS   )loads    r   _parse_loadrb      s    $!!	D%	 	 t9>uTF*EFGGd1gu%%a$q'**Q00$q'47++FtAwiMO P P
jd -: ; < <r   N)abcr   collectionsr   !sympy.physics.mechanics.body_baser   sympy.physics.vectorr   r   r   __all__r	   r
   r   rZ   rb   r    r   r   <module>rh      sW     " 6 > >
)sJzJ+AB "3H 3l2X 2j:<r   