class_docstr: Linear pathway between a pair of attachment points.
  
  Explanation
  ===========
  
  A linear pathway forms a straight-line segment between two points and is
  the simplest pathway that can be formed. It will not interact with any
  other objects in the system, i.e. a ``LinearPathway`` will intersect other
  objects to ensure that the path between its two ends (its attachments) is
  the shortest possible.
  
  A linear 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 LinearPathway
  
  To construct a pathway, two points are required to be passed to the
  ``attachments`` parameter as a ``tuple``.
  
  >>> from sympy.physics.mechanics import Point
  >>> pA, pB = Point('pA'), Point('pB')
  >>> linear_pathway = LinearPathway(pA, pB)
  >>> linear_pathway
  LinearPathway(pA, pB)
  
  The pathway created above isn't very interesting without the positions and
  velocities of its attachment points being described. Without this its not
  possible to describe how the pathway moves, i.e. its length or its
  extension velocity.
  
  >>> from sympy.physics.mechanics import ReferenceFrame
  >>> from sympy.physics.vector import dynamicsymbols
  >>> N = ReferenceFrame('N')
  >>> q = dynamicsymbols('q')
  >>> pB.set_pos(pA, q*N.x)
  >>> pB.pos_from(pA)
  q(t)*N.x
  
  A pathway's length can be accessed via its ``length`` attribute.
  
  >>> linear_pathway.length
  sqrt(q(t)**2)
  
  Note how what appears to be an overly-complex expression is returned. This
  is actually required as it ensures that a pathway's length is always
  positive.
  
  A pathway's extension velocity can be accessed similarly via its
  ``extension_velocity`` attribute.
  
  >>> linear_pathway.extension_velocity
  sqrt(q(t)**2)*Derivative(q(t), t)/q(t)
  
  Parameters
  ==========
  
  attachments : tuple[Point, Point]
      Pair of ``Point`` objects between which the linear pathway spans.
      Constructor expects two points to be passed, e.g.
      ``LinearPathway(Point('pA'), Point('pB'))``. More or fewer points will
      cause an error to be thrown.
class_docstr_tok: ["Linear","pathway","between","a","pair","of","attachment","points",".","Explanation","===========","A","linear","pathway","forms","a","straight-line","segment","between","two","points","and","is","the","simplest","pathway","that","can","be","formed",".","It","will","not","interact","with","any","other","objects","in","the","system",",","i.e",".","a","``","LinearPathway","``","will","intersect","other","objects","to","ensure","that","the","path","between","its","two","ends","(","its","attachments",")","is","the","shortest","possible",".","A","linear","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","LinearPathway","To","construct","a","pathway",",","two","points","are","required","to","be","passed","to","the","``","attachments","``","parameter","as","a","``","tuple","``",".",">",">",">","from","sympy.physics.mechanics","import","Point",">",">",">","pA",",","pB","=","Point","(","'pA","'",")",",","Point","(","'pB","'",")",">",">",">","linear_pathway","=","LinearPathway","(","pA",",","pB",")",">",">",">","linear_pathway","LinearPathway","(","pA",",","pB",")","The","pathway","created","above","is","n't","very","interesting","without","the","positions","and","velocities","of","its","attachment","points","being","described",".","Without","this","its","not","possible","to","describe","how","the","pathway","moves",",","i.e",".","its","length","or","its","extension","velocity",".",">",">",">","from","sympy.physics.mechanics","import","ReferenceFrame",">",">",">","from","sympy.physics.vector","import","dynamicsymbols",">",">",">","N","=","ReferenceFrame","(","'N","'",")",">",">",">","q","=","dynamicsymbols","(","'","q","'",")",">",">",">","pB.set_pos","(","pA",",","q","*","N.x",")",">",">",">","pB.pos_from","(","pA",")","q","(","t",")","*","N.x","A","pathway","'s","length","can","be","accessed","via","its","``","length","``","attribute",".",">",">",">","linear_pathway.length","sqrt","(","q","(","t",")","*","*","2",")","Note","how","what","appears","to","be","an","overly-complex","expression","is","returned",".","This","is","actually","required","as","it","ensures","that","a","pathway","'s","length","is","always","positive",".","A","pathway","'s","extension","velocity","can","be","accessed","similarly","via","its","``","extension_velocity","``","attribute",".",">",">",">","linear_pathway.extension_velocity","sqrt","(","q","(","t",")","*","*","2",")","*","Derivative","(","q","(","t",")",",","t",")","\/q","(","t",")","Parameters","==========","attachments",":","tuple","[","Point",",","Point","]","Pair","of","``","Point","``","objects","between","which","the","linear","pathway","spans",".","Constructor","expects","two","points","to","be","passed",",","e.g",".","``","LinearPathway","(","Point","(","'pA","'",")",",","Point","(","'pB","'",")",")","``",".","More","or","fewer","points","will","cause","an","error","to","be","thrown","."]
docstr: Exact analytical expression for the pathway's length.
docstr_tok: ["Exact","analytical","expression","for","the","pathway","'s","length","."]
code: def length(self):
      """Exact analytical expression for the pathway's length."""
      return _point_pair_length(*self.attachments)
  
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 2 for calling the LinearPathway obj's underlying member method code with example usage: obj.length() and returns: _point_pair_length