o
    oh                     @   s   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 g dZ
G dd deeddd	gZG d
d deZG dd deZdd Zdd ZdS )    )ABC)
namedtuple)BodyBase)VectorReferenceFramePoint)LoadBaseForceTorquec                   @   s(   e Zd ZdZdd Zdd ZeZeZdS )r   z2Abstract base class for the various loading types.c                 C      t d| jj d|jj d)Nz$unsupported operand type(s) for +: '' and ''	TypeError	__class____name__selfother r   q/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/physics/mechanics/loads.py__add__   
   
zLoadBase.__add__c                 C   r   )Nz$unsupported operand type(s) for *: 'r   r   r   r   r   r   r   __mul__   r   zLoadBase.__mul__N)r   
__module____qualname____doc__r   r   __radd____rmul__r   r   r   r   r   	   s    r   locationvectorc                       @   e Zd ZdZ fddZdd Zedd Zedd	 Z  Z	S )
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                    D   t |tr|j}t |tstdt |tstdt | ||S )Nz!Force location should be a Point.z Force vector should be a Vector.)
isinstancer   
masscenterr   r   r   super__new__)clspointforcer   r   r   r&   :      


zForce.__new__c                 C      | j j d| j d| j dS )Nz(point=z, force=))r   r   r(   r)   r   r   r   r   __repr__C      zForce.__repr__c                 C      | j S Nr   r.   r   r   r   r(   G      zForce.pointc                 C   r1   r2   r    r.   r   r   r   r)   K   r4   zForce.force)
r   r   r   r   r&   r/   propertyr(   r)   __classcell__r   r   r*   r   r	      s    	
r	   c                       r!   )
r
   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                    r"   )Nz+Torque location should be a ReferenceFrame.z!Torque vector should be a Vector.)r#   r   framer   r   r   r%   r&   )r'   r8   torquer*   r   r   r&   o   r+   zTorque.__new__c                 C   r,   )Nz(frame=z	, torque=r-   )r   r   r8   r9   r.   r   r   r   r/   x   r0   zTorque.__repr__c                 C   r1   r2   r3   r.   r   r   r   r8   |   r4   zTorque.framec                 C   r1   r2   r5   r.   r   r   r   r9      r4   zTorque.torque)
r   r   r   r   r&   r/   r6   r8   r9   r7   r   r   r*   r   r
   P   s    	
r
   c                 G   sF   g }|D ]}t |tstt| d|t|j|j|   q|S )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bodyr   r   r   gravity   s   
rA   c                 C   s   t | tr| S t | trDt| dkrtd|  dt | d tr*t| d | d S t | d tr:t| d | d S td| d  dt	dt
|  d	)
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   r:   )loadr   r   r   _parse_load   s   

rH   N)abcr   collectionsr   !sympy.physics.mechanics.body_baser   sympy.physics.vectorr   r   r   __all__r   r	   r
   rA   rH   r   r   r   r   <module>   s    65