class_docstr: A Truss is an assembly of members such as beams,
  connected by nodes, that create a rigid structure.
  In engineering, a truss is a structure that
  consists of two-force members only.
  
  Trusses are extremely important in engineering applications
  and can be seen in numerous real-world applications like bridges.
  
  Examples
  ========
  
  There is a Truss consisting of four nodes and five
  members connecting the nodes. A force P acts
  downward on the node D and there also exist pinned
  and roller joints on the nodes A and B respectively.
  
  .. image:: truss_example.png
  
  >>> from sympy.physics.continuum_mechanics.truss import Truss
  >>> t = Truss()
  >>> t.add_node(("node_1", 0, 0), ("node_2", 6, 0), ("node_3", 2, 2), ("node_4", 2, 0))
  >>> t.add_member(("member_1", "node_1", "node_4"), ("member_2", "node_2", "node_4"), ("member_3", "node_1", "node_3"))
  >>> t.add_member(("member_4", "node_2", "node_3"), ("member_5", "node_3", "node_4"))
  >>> t.apply_load(("node_4", 10, 270))
  >>> t.apply_support(("node_1", "pinned"), ("node_2", "roller"))
docstr: This method changes the label(s) of the specified node(s).
  
  Parameters
  ==========
  The input(s) of this method are tuple(s) of the form (label, new_label).
  
  label: String or Symbol
      The label of the node for which the label has
      to be changed.
  
  new_label: String or Symbol
      The new label of the node.
  
  Examples
  ========
  
  >>> from sympy.physics.continuum_mechanics.truss import Truss
  >>> t = Truss()
  >>> t.add_node(('A', 0, 0), ('B', 3, 0))
  >>> t.nodes
  [('A', 0, 0), ('B', 3, 0)]
  >>> t.change_node_label(('A', 'C'), ('B', 'D'))
  >>> t.nodes
  [('C', 0, 0), ('D', 3, 0)]
docstr_tok: ["This","method","changes","the","label","(","s",")","of","the","specified","node","(","s",")",".","Parameters","==========","The","input","(","s",")","of","this","method","are","tuple","(","s",")","of","the","form","(","label",",","new_label",")",".","label",":","String","or","Symbol","The","label","of","the","node","for","which","the","label","has","to","be","changed",".","new_label",":","String","or","Symbol","The","new","label","of","the","node",".","Examples","========",">",">",">","from","sympy.physics.continuum_mechanics.truss","import","Truss",">",">",">","t","=","Truss","(",")",">",">",">","t.add_node","(","(","'","A","'",",","0",",","0",")",",","(","'","B","'",",","3",",","0",")",")",">",">",">","t.nodes","[","(","'","A","'",",","0",",","0",")",",","(","'","B","'",",","3",",","0",")","]",">",">",">","t.change_node_label","(","(","'","A","'",",","'","C","'",")",",","(","'","B","'",",","'D","'",")",")",">",">",">","t.nodes","[","(","'","C","'",",","0",",","0",")",",","(","'D","'",",","3",",","0",")","]"]
code: def change_node_label(self, *args):
      """
      This method changes the label(s) of the specified node(s).
  
      Parameters
      ==========
      The input(s) of this method are tuple(s) of the form (label, new_label).
  
      label: String or Symbol
          The label of the node for which the label has
          to be changed.
  
      new_label: String or Symbol
          The new label of the node.
  
      Examples
      ========
  
      >>> from sympy.physics.continuum_mechanics.truss import Truss
      >>> t = Truss()
      >>> t.add_node(('A', 0, 0), ('B', 3, 0))
      >>> t.nodes
      [('A', 0, 0), ('B', 3, 0)]
      >>> t.change_node_label(('A', 'C'), ('B', 'D'))
      >>> t.nodes
      [('C', 0, 0), ('D', 3, 0)]
      """
      for i in args:
          label = i[0]
          new_label = i[1]
          if label not in self._node_coordinates:
              raise ValueError("No such node exists for the Truss")
          elif new_label in self._node_coordinates:
              raise ValueError(
                  "A node with the given label already exists"
              )
          else:
              for node in self._nodes:
                  if node[0] == label:
                      self._nodes[
                          self._nodes.index((label, node[1], node[2]))
                      ] = (new_label, node[1], node[2])
                      self._node_labels[
                          self._node_labels.index(node[0])
                      ] = new_label
                      self._node_coordinates[
                          new_label
                      ] = self._node_coordinates[label]
                      self._node_coordinates.pop(label)
                      if node[0] in self._supports:
                          self._supports[new_label] = self._supports[
                              node[0]
                          ]
                          self._supports.pop(node[0])
                      if new_label in self._supports:
                          if self._supports[new_label] == "pinned":
                              if (
                                  "R_" + str(label) + "_x"
                                  in self._reaction_loads
                                  and "R_" + str(label) + "_y"
                                  in self._reaction_loads
                              ):
                                  self._reaction_loads[
                                      "R_" + str(new_label) + "_x"
                                  ] = self._reaction_loads[
                                      "R_" + str(label) + "_x"
                                  ]
                                  self._reaction_loads[
                                      "R_" + str(new_label) + "_y"
                                  ] = self._reaction_loads[
                                      "R_" + str(label) + "_y"
                                  ]
                                  self._reaction_loads.pop(
                                      "R_" + str(label) + "_x"
                                  )
                                  self._reaction_loads.pop(
                                      "R_" + str(label) + "_y"
                                  )
                              self._loads[new_label] = self._loads[
                                  label
                              ]
                              for load in self._loads[new_label]:
                                  if load[1] == 90:
                                      load[0] -= Symbol(
                                          "R_" + str(label) + "_y"
                                      )
                                      if load[0] == 0:
                                          self._loads[label].remove(
                                              load
                                          )
                                      break
                              for load in self._loads[new_label]:
                                  if load[1] == 0:
                                      load[0] -= Symbol(
                                          "R_" + str(label) + "_x"
                                      )
                                      if load[0] == 0:
                                          self._loads[label].remove(
                                              load
                                          )
                                      break
                              self.apply_load(
                                  new_label,
                                  Symbol("R_" + str(new_label) + "_x"),
                                  0,
                              )
                              self.apply_load(
                                  new_label,
                                  Symbol("R_" + str(new_label) + "_y"),
                                  90,
                              )
                              self._loads.pop(label)
                          elif self._supports[new_label] == "roller":
                              self._loads[new_label] = self._loads[
                                  label
                              ]
                              for load in self._loads[label]:
                                  if load[1] == 90:
                                      load[0] -= Symbol(
                                          "R_" + str(label) + "_y"
                                      )
                                      if load[0] == 0:
                                          self._loads[label].remove(
                                              load
                                          )
                                      break
                              self.apply_load(
                                  new_label,
                                  Symbol("R_" + str(new_label) + "_y"),
                                  90,
                              )
                              self._loads.pop(label)
                      else:
                          if label in self._loads:
                              self._loads[new_label] = self._loads[
                                  label
                              ]
                              self._loads.pop(label)
                      for member in self._members:
                          if self._members[member][0] == node[0]:
                              self._members[member][0] = new_label
                              self._nodes_occupied[
                                  (new_label, self._members[member][1])
                              ] = True
                              self._nodes_occupied[
                                  (self._members[member][1], new_label)
                              ] = True
                              self._nodes_occupied.pop(
                                  (label, self._members[member][1])
                              )
                              self._nodes_occupied.pop(
                                  (self._members[member][1], label)
                              )
                          elif self._members[member][1] == node[0]:
                              self._members[member][1] = new_label
                              self._nodes_occupied[
                                  (self._members[member][0], new_label)
                              ] = True
                              self._nodes_occupied[
                                  (new_label, self._members[member][0])
                              ] = True
                              self._nodes_occupied.pop(
                                  (self._members[member][0], label)
                              )
                              self._nodes_occupied.pop(
                                  (label, self._members[member][0])
                              )
  
imports: from cmath import atan, inf
  from sympy.core.add import Add
  from sympy.core.evalf import INF
  from sympy.core.mul import Mul
  from sympy.core.symbol import Symbol
  from sympy.core.sympify import sympify
  from sympy import Matrix, pi
  from sympy.external.importtools import import_module
  from sympy.functions.elementary.miscellaneous import sqrt
  from sympy.matrices.dense import zeros
  import math
  from sympy.physics.units.quantities import Quantity
  from sympy.plotting import plot
  from sympy.utilities.decorator import doctest_depends_on
  from sympy import sin, cos
label_desc: Use image node_id 15 for calling the Truss obj's underlying member method code with example usage: obj.change_node_label() without return types