Esempio n. 1
0
class VolumeCalculatorThread(OutputThread):
    def __init__(self, volume_type, var_ID, second_var_ID, input_stream,
                 polynames, polygons, time_sampling_frequency, mesh, separator,
                 fmt_float):
        super().__init__()

        self.calculator = VolumeCalculator(volume_type, var_ID, second_var_ID,
                                           input_stream, polynames, polygons,
                                           time_sampling_frequency)
        self.mesh = mesh
        self.separator = separator
        self.fmt_float = fmt_float

    def run_calculator(self):
        self.tick.emit(2)
        QApplication.processEvents()

        logging.info('Starting to process the mesh')
        self.calculator.mesh = self.mesh
        self.tick.emit(10)
        QApplication.processEvents()

        iter_pbar = ProgressBarIterator.prepare(self.tick.emit, (10, 30))
        self.calculator.construct_weights(iter_pbar)
        logging.info('Finished processing the mesh')

        result = []
        iter_pbar = ProgressBarIterator.prepare(self.tick.emit, (30, 100))
        for time_index in iter_pbar(self.calculator.time_indices):
            if self.canceled:
                return []
            i_result = [str(self.calculator.input_stream.time[time_index])]
            values = self.calculator.read_values_in_frame(time_index)

            for j in range(len(self.calculator.polygons)):
                if self.canceled:
                    return []
                weight = self.calculator.weights[j]
                volume = self.calculator.volume_in_frame_in_polygon(
                    weight, values, self.calculator.polygons[j])
                if self.calculator.volume_type == VolumeCalculator.POSITIVE:
                    for v in volume:
                        i_result.append(self.fmt_float.format(v))
                else:
                    i_result.append(self.fmt_float.format(volume))
            result.append(i_result)

        return result

    def write_csv(self, output_stream):
        result = self.run_calculator()
        self.calculator.write_csv(result, output_stream, self.separator)
Esempio n. 2
0
def slf_volume(args):
    # Read set of lines from input file
    polygons = []
    if args.in_polygons.endswith('.i2s'):
        with BlueKenue.Read(args.in_polygons) as f:
            f.read_header()
            for poly in f.get_polygons():
                polygons.append(poly)
    elif args.in_polygons.endswith('.shp'):
        try:
            for polygon in Shapefile.get_polygons(args.in_polygons):
                polygons.append(polygon)
        except ShapefileException as e:
            logger.error(e)
            sys.exit(3)
    else:
        logger.error('File "%s" is not a i2s or shp file.' % args.in_polygons)
        sys.exit(2)

    if not polygons:
        logger.error('The file does not contain any polygon.')
        sys.exit(1)
    logger.debug('The file contains {} polygon{}.'.format(len(polygons), 's' if len(polygons) > 1 else ''))

    names = ['Polygon %d' % (i + 1) for i in range(len(polygons))]

    # Read Serafin file
    with Serafin.Read(args.in_slf, args.lang) as resin:
        resin.read_header()
        logger.info(resin.header.summary())
        resin.get_time()

        if not resin.header.is_2d:
            logger.error('The file has to be a 2D Serafin!')
            sys.exit(3)

        # Check variables consistency
        if args.upper_var not in resin.header.var_IDs:
            logger.error('Upper variable "%s" is not in Serafin file' % args.upper_var)
            sys.exit(1)
        upper_var = args.upper_var
        lower_var = args.lower_var
        if args.lower_var is not None:
            if args.lower_var == 'init':
                lower_var = VolumeCalculator.INIT_VALUE
            else:
                if lower_var not in resin.header.var_IDs:
                    logger.error('Lower variable "%s" is not in Serafin file' % lower_var)
                    sys.exit(1)

        if args.detailed:
            volume_type = VolumeCalculator.POSITIVE
        else:
            volume_type = VolumeCalculator.NET
        calculator = VolumeCalculator(volume_type, upper_var, lower_var, resin, names, polygons, args.ech)
        calculator.construct_triangles(tqdm)
        calculator.construct_weights(tqdm)

        result = []
        for time_index in tqdm(calculator.time_indices, unit='frame'):
            i_result = [str(resin.time[time_index])]
            values = calculator.read_values_in_frame(time_index)

            for j in range(len(calculator.polygons)):
                weight = calculator.weights[j]
                volume = calculator.volume_in_frame_in_polygon(weight, values, calculator.polygons[j])
                if calculator.volume_type == VolumeCalculator.POSITIVE:
                    for v in volume:
                        i_result.append(settings.FMT_FLOAT.format(v))
                else:
                    i_result.append(settings.FMT_FLOAT.format(volume))
            result.append(i_result)

        # Write CSV
        mode = 'w' if args.force else 'x'
        with open(args.out_csv, mode) as out_csv:
            calculator.write_csv(result, out_csv, args.sep)