code: def perform_evaluation(self):
          
          # Create effect vector (with max length)
          if not self.max_effect_length:
              # no effect is possible, return an empty list
              return []
          edge = cadquery.Edge.makeLine(
              self.location.origin,
              self.location.origin + (self.location.zDir * -(self.max_effect_length + 1))  # +1 to avoid rounding errors
          )
          wire = cadquery.Wire.assembleEdges([edge])
          wp = cadquery.Workplane('XY').newObject([wire])
  
          effect_list = []  # list of self.effect_class instances
          for part in self.parts:
              solid = part.world_obj.translate((0, 0, 0))
              intersection = solid.intersect(copy(wp))
              effect = self.effect_class(
                  location=self.location,
                  part=part,
                  result=intersection,
              )
              if effect:
                  effect_list.append(effect)
  
          return sorted(effect_list)
docs: Determine which parts lie along the given vector, and what length
  
          :return: effects on the given parts (in order of the distance from
                   the start point)
          :rtype: list(:class:`VectorEffect`)