class_docstr: Pathway that wraps a geometry object.
  
  Explanation
  ===========
  
  A wrapping pathway interacts with a geometry object and forms a path that
  wraps smoothly along its surface. The wrapping pathway along the geometry
  object will be the geodesic that the geometry object defines based on the
  two points. It will not interact with any other objects in the system, i.e.
  a ``WrappingPathway`` will intersect other objects to ensure that the path
  between its two ends (its attachments) is the shortest possible.
  
  To explain the sign conventions used for pathway length, extension
  velocity, and direction of applied forces, we can ignore the geometry with
  which the wrapping pathway interacts. A wrapping pathway is made up of two
  points that can move relative to each other, and a pair of equal and
  opposite forces acting on the points. If the positive time-varying
  Euclidean distance between the two points is defined, then the "extension
  velocity" is the time derivative of this distance. The extension velocity
  is positive when the two points are moving away from each other and
  negative when moving closer to each other. The direction for the force
  acting on either point is determined by constructing a unit vector directed
  from the other point to this point. This establishes a sign convention such
  that a positive force magnitude tends to push the points apart. The
  following diagram shows the positive force sense and the distance between
  the points::
  
     P           Q
     o<--- F --->o
     |           |
     |<--l(t)--->|
  
  Examples
  ========
  
  >>> from sympy.physics.mechanics import WrappingPathway
  
  To construct a wrapping pathway, like other pathways, a pair of points must
  be passed, followed by an instance of a wrapping geometry class as a
  keyword argument. We'll use a cylinder with radius ``r`` and its axis
  parallel to ``N.x`` passing through a point ``pO``.
  
  >>> from sympy import symbols
  >>> from sympy.physics.mechanics import Point, ReferenceFrame, WrappingCylinder
  >>> r = symbols('r')
  >>> N = ReferenceFrame('N')
  >>> pA, pB, pO = Point('pA'), Point('pB'), Point('pO')
  >>> cylinder = WrappingCylinder(r, pO, N.x)
  >>> wrapping_pathway = WrappingPathway(pA, pB, cylinder)
  >>> wrapping_pathway
  WrappingPathway(pA, pB, geometry=WrappingCylinder(radius=r, point=pO,
      axis=N.x))
  
  Parameters
  ==========
  
  attachment_1 : Point
      First of the pair of ``Point`` objects between which the wrapping
      pathway spans.
  attachment_2 : Point
      Second of the pair of ``Point`` objects between which the wrapping
      pathway spans.
  geometry : WrappingGeometryBase
      Geometry about which the pathway wraps.
class_docstr_tok: ["Pathway","that","wraps","a","geometry","object",".","Explanation","===========","A","wrapping","pathway","interacts","with","a","geometry","object","and","forms","a","path","that","wraps","smoothly","along","its","surface",".","The","wrapping","pathway","along","the","geometry","object","will","be","the","geodesic","that","the","geometry","object","defines","based","on","the","two","points",".","It","will","not","interact","with","any","other","objects","in","the","system",",","i.e",".","a","``","WrappingPathway","``","will","intersect","other","objects","to","ensure","that","the","path","between","its","two","ends","(","its","attachments",")","is","the","shortest","possible",".","To","explain","the","sign","conventions","used","for","pathway","length",",","extension","velocity",",","and","direction","of","applied","forces",",","we","can","ignore","the","geometry","with","which","the","wrapping","pathway","interacts",".","A","wrapping","pathway","is","made","up","of","two","points","that","can","move","relative","to","each","other",",","and","a","pair","of","equal","and","opposite","forces","acting","on","the","points",".","If","the","positive","time-varying","Euclidean","distance","between","the","two","points","is","defined",",","then","the","``","extension","velocity","''","is","the","time","derivative","of","this","distance",".","The","extension","velocity","is","positive","when","the","two","points","are","moving","away","from","each","other","and","negative","when","moving","closer","to","each","other",".","The","direction","for","the","force","acting","on","either","point","is","determined","by","constructing","a","unit","vector","directed","from","the","other","point","to","this","point",".","This","establishes","a","sign","convention","such","that","a","positive","force","magnitude","tends","to","push","the","points","apart",".","The","following","diagram","shows","the","positive","force","sense","and","the","distance","between","the","points",":",":","P","Q","o","<","--","-","F","--","-",">","o","|","|","|","<","--","l","(","t",")","--","-",">","|","Examples","========",">",">",">","from","sympy.physics.mechanics","import","WrappingPathway","To","construct","a","wrapping","pathway",",","like","other","pathways",",","a","pair","of","points","must","be","passed",",","followed","by","an","instance","of","a","wrapping","geometry","class","as","a","keyword","argument",".","We","'ll","use","a","cylinder","with","radius","``","r","``","and","its","axis","parallel","to","``","N.x","``","passing","through","a","point","``","pO","``",".",">",">",">","from","sympy","import","symbols",">",">",">","from","sympy.physics.mechanics","import","Point",",","ReferenceFrame",",","WrappingCylinder",">",">",">","r","=","symbols","(","'","r","'",")",">",">",">","N","=","ReferenceFrame","(","'N","'",")",">",">",">","pA",",","pB",",","pO","=","Point","(","'pA","'",")",",","Point","(","'pB","'",")",",","Point","(","'pO","'",")",">",">",">","cylinder","=","WrappingCylinder","(","r",",","pO",",","N.x",")",">",">",">","wrapping_pathway","=","WrappingPathway","(","pA",",","pB",",","cylinder",")",">",">",">","wrapping_pathway","WrappingPathway","(","pA",",","pB",",","geometry=WrappingCylinder","(","radius=r",",","point=pO",",","axis=N.x",")",")","Parameters","==========","attachment_1",":","Point","First","of","the","pair","of","``","Point","``","objects","between","which","the","wrapping","pathway","spans",".","attachment_2",":","Point","Second","of","the","pair","of","``","Point","``","objects","between","which","the","wrapping","pathway","spans",".","geometry",":","WrappingGeometryBase","Geometry","about","which","the","pathway","wraps","."]
docstr: Loads required by the equations of motion method classes.
  
  Explanation
  ===========
  
  ``KanesMethod`` requires a list of ``Point``-``Vector`` tuples to be
  passed to the ``loads`` parameters of its ``kanes_equations`` method
  when constructing the equations of motion. This method acts as a
  utility to produce the correctly-structred pairs of points and vectors
  required so that these can be easily concatenated with other items in
  the list of loads and passed to ``KanesMethod.kanes_equations``. These
  loads are also in the correct form to also be passed to the other
  equations of motion method classes, e.g. ``LagrangesMethod``.
  
  Examples
  ========
  
  The below example shows how to generate the loads produced in an
  actuator that produces an expansile force ``F`` while wrapping around a
  cylinder. First, create a cylinder with radius ``r`` and an axis
  parallel to the ``N.z`` direction of the global frame ``N`` that also
  passes through a point ``pO``.
  
  >>> from sympy import symbols
  >>> from sympy.physics.mechanics import (Point, ReferenceFrame,
  ...     WrappingCylinder)
  >>> N = ReferenceFrame('N')
  >>> r = symbols('r', positive=True)
  >>> pO = Point('pO')
  >>> cylinder = WrappingCylinder(r, pO, N.z)
  
  Create the pathway of the actuator using the ``WrappingPathway`` class,
  defined to span between two points ``pA`` and ``pB``. Both points lie
  on the surface of the cylinder and the location of ``pB`` is defined
  relative to ``pA`` by the dynamics symbol ``q``.
  
  >>> from sympy import cos, sin
  >>> from sympy.physics.mechanics import WrappingPathway, dynamicsymbols
  >>> q = dynamicsymbols('q')
  >>> pA = Point('pA')
  >>> pB = Point('pB')
  >>> pA.set_pos(pO, r*N.x)
  >>> pB.set_pos(pO, r*(cos(q)*N.x + sin(q)*N.y))
  >>> pB.pos_from(pA)
  (r*cos(q(t)) - r)*N.x + r*sin(q(t))*N.y
  >>> pathway = WrappingPathway(pA, pB, cylinder)
  
  Now create a symbol ``F`` to describe the magnitude of the (expansile)
  force that will be produced along the pathway. The list of loads that
  ``KanesMethod`` requires can be produced by calling the pathway's
  ``to_loads`` method with ``F`` passed as the only argument.
  
  >>> F = symbols('F')
  >>> loads = pathway.to_loads(F)
  >>> [load.__class__(load.location, load.vector.simplify()) for load in loads]
  [(pA, F*N.y), (pB, F*sin(q(t))*N.x - F*cos(q(t))*N.y),
   (pO, - F*sin(q(t))*N.x + F*(cos(q(t)) - 1)*N.y)]
  
  Parameters
  ==========
  
  force : Expr
      Magnitude of the force acting along the length of the pathway. It
      is assumed that this ``Expr`` represents an expansile force.
docstr_tok: ["Loads","required","by","the","equations","of","motion","method","classes",".","Explanation","===========","``","KanesMethod","``","requires","a","list","of","``","Point","``","-","``","Vector","``","tuples","to","be","passed","to","the","``","loads","``","parameters","of","its","``","kanes_equations","``","method","when","constructing","the","equations","of","motion",".","This","method","acts","as","a","utility","to","produce","the","correctly-structred","pairs","of","points","and","vectors","required","so","that","these","can","be","easily","concatenated","with","other","items","in","the","list","of","loads","and","passed","to","``","KanesMethod.kanes_equations","``",".","These","loads","are","also","in","the","correct","form","to","also","be","passed","to","the","other","equations","of","motion","method","classes",",","e.g",".","``","LagrangesMethod","``",".","Examples","========","The","below","example","shows","how","to","generate","the","loads","produced","in","an","actuator","that","produces","an","expansile","force","``","F","``","while","wrapping","around","a","cylinder",".","First",",","create","a","cylinder","with","radius","``","r","``","and","an","axis","parallel","to","the","``","N.z","``","direction","of","the","global","frame","``","N","``","that","also","passes","through","a","point","``","pO","``",".",">",">",">","from","sympy","import","symbols",">",">",">","from","sympy.physics.mechanics","import","(","Point",",","ReferenceFrame",",","...","WrappingCylinder",")",">",">",">","N","=","ReferenceFrame","(","'N","'",")",">",">",">","r","=","symbols","(","'","r","'",",","positive=True",")",">",">",">","pO","=","Point","(","'pO","'",")",">",">",">","cylinder","=","WrappingCylinder","(","r",",","pO",",","N.z",")","Create","the","pathway","of","the","actuator","using","the","``","WrappingPathway","``","class",",","defined","to","span","between","two","points","``","pA","``","and","``","pB","``",".","Both","points","lie","on","the","surface","of","the","cylinder","and","the","location","of","``","pB","``","is","defined","relative","to","``","pA","``","by","the","dynamics","symbol","``","q","``",".",">",">",">","from","sympy","import","cos",",","sin",">",">",">","from","sympy.physics.mechanics","import","WrappingPathway",",","dynamicsymbols",">",">",">","q","=","dynamicsymbols","(","'","q","'",")",">",">",">","pA","=","Point","(","'pA","'",")",">",">",">","pB","=","Point","(","'pB","'",")",">",">",">","pA.set_pos","(","pO",",","r","*","N.x",")",">",">",">","pB.set_pos","(","pO",",","r","*","(","cos","(","q",")","*","N.x","+","sin","(","q",")","*","N.y",")",")",">",">",">","pB.pos_from","(","pA",")","(","r","*","cos","(","q","(","t",")",")","-","r",")","*","N.x","+","r","*","sin","(","q","(","t",")",")","*","N.y",">",">",">","pathway","=","WrappingPathway","(","pA",",","pB",",","cylinder",")","Now","create","a","symbol","``","F","``","to","describe","the","magnitude","of","the","(","expansile",")","force","that","will","be","produced","along","the","pathway",".","The","list","of","loads","that","``","KanesMethod","``","requires","can","be","produced","by","calling","the","pathway's","``","to_loads","``","method","with","``","F","``","passed","as","the","only","argument",".",">",">",">","F","=","symbols","(","'","F","'",")",">",">",">","loads","=","pathway.to_loads","(","F",")",">",">",">","[","load.__class__","(","load.location",",","load.vector.simplify","(",")",")","for","load","in","loads","]","[","(","pA",",","F","*","N.y",")",",","(","pB",",","F","*","sin","(","q","(","t",")",")","*","N.x","-","F","*","cos","(","q","(","t",")",")","*","N.y",")",",","(","pO",",","-","F","*","sin","(","q","(","t",")",")","*","N.x","+","F","*","(","cos","(","q","(","t",")",")","-","1",")","*","N.y",")","]","Parameters","==========","force",":","Expr","Magnitude","of","the","force","acting","along","the","length","of","the","pathway",".","It","is","assumed","that","this","``","Expr","``","represents","an","expansile","force","."]
code: def to_loads(self, force):
      """Loads required by the equations of motion method classes.
  
      Explanation
      ===========
  
      ``KanesMethod`` requires a list of ``Point``-``Vector`` tuples to be
      passed to the ``loads`` parameters of its ``kanes_equations`` method
      when constructing the equations of motion. This method acts as a
      utility to produce the correctly-structred pairs of points and vectors
      required so that these can be easily concatenated with other items in
      the list of loads and passed to ``KanesMethod.kanes_equations``. These
      loads are also in the correct form to also be passed to the other
      equations of motion method classes, e.g. ``LagrangesMethod``.
  
      Examples
      ========
  
      The below example shows how to generate the loads produced in an
      actuator that produces an expansile force ``F`` while wrapping around a
      cylinder. First, create a cylinder with radius ``r`` and an axis
      parallel to the ``N.z`` direction of the global frame ``N`` that also
      passes through a point ``pO``.
  
      >>> from sympy import symbols
      >>> from sympy.physics.mechanics import (Point, ReferenceFrame,
      ...     WrappingCylinder)
      >>> N = ReferenceFrame('N')
      >>> r = symbols('r', positive=True)
      >>> pO = Point('pO')
      >>> cylinder = WrappingCylinder(r, pO, N.z)
  
      Create the pathway of the actuator using the ``WrappingPathway`` class,
      defined to span between two points ``pA`` and ``pB``. Both points lie
      on the surface of the cylinder and the location of ``pB`` is defined
      relative to ``pA`` by the dynamics symbol ``q``.
  
      >>> from sympy import cos, sin
      >>> from sympy.physics.mechanics import WrappingPathway, dynamicsymbols
      >>> q = dynamicsymbols('q')
      >>> pA = Point('pA')
      >>> pB = Point('pB')
      >>> pA.set_pos(pO, r*N.x)
      >>> pB.set_pos(pO, r*(cos(q)*N.x + sin(q)*N.y))
      >>> pB.pos_from(pA)
      (r*cos(q(t)) - r)*N.x + r*sin(q(t))*N.y
      >>> pathway = WrappingPathway(pA, pB, cylinder)
  
      Now create a symbol ``F`` to describe the magnitude of the (expansile)
      force that will be produced along the pathway. The list of loads that
      ``KanesMethod`` requires can be produced by calling the pathway's
      ``to_loads`` method with ``F`` passed as the only argument.
  
      >>> F = symbols('F')
      >>> loads = pathway.to_loads(F)
      >>> [load.__class__(load.location, load.vector.simplify()) for load in loads]
      [(pA, F*N.y), (pB, F*sin(q(t))*N.x - F*cos(q(t))*N.y),
       (pO, - F*sin(q(t))*N.x + F*(cos(q(t)) - 1)*N.y)]
  
      Parameters
      ==========
  
      force : Expr
          Magnitude of the force acting along the length of the pathway. It
          is assumed that this ``Expr`` represents an expansile force.
  
      """
      pA, pB = self.attachments
      pO = self.geometry.point
      pA_force, pB_force = self.geometry.geodesic_end_vectors(pA, pB)
      pO_force = -(pA_force + pB_force)
  
      loads = [
          Force(pA, force * pA_force),
          Force(pB, force * pB_force),
          Force(pO, force * pO_force),
      ]
      return loads
  
imports: from abc import ABC, abstractmethod
  from sympy.core.singleton import S
  from sympy.physics.mechanics.loads import Force
  from sympy.physics.mechanics.wrapping_geometry import WrappingGeometryBase
  from sympy.physics.vector import Point, dynamicsymbols
label_desc: Use image node_id 6 for calling the WrappingPathway obj's underlying member method code with example usage: obj.to_loads(force) and returns: loads