code: def endMove(self, copy=False):
      assert self.selectedShapes and self.selectedShapesCopy
      assert len(self.selectedShapesCopy) == len(self.selectedShapes)
      if copy:
          for i, shape in enumerate(self.selectedShapesCopy):
              shape.idx = len(self.shapes)  # add current box index
              self.shapes.append(shape)
              self.selectedShapes[i].selected = False
              self.selectedShapes[i] = shape
      else:
          for i, shape in enumerate(self.selectedShapesCopy):
              self.selectedShapes[i].points = shape.points
      self.selectedShapesCopy = []
      self.repaint()
      self.storeShapes()
      return True
  
imports: import copy
  from PyQt5.QtCore import Qt, pyqtSignal, QPointF, QPoint
  from PyQt5.QtGui import QPainter, QBrush, QColor, QPixmap
  from PyQt5.QtWidgets import QWidget, QMenu, QApplication
  from libs.shape import Shape
  from libs.utils import distance
label_desc: Use image node_id 15 for calling the Canvas obj's underlying member method code with example usage: obj.endMove(copy) and returns: True