You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.9 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkSortFileNames.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkSortFileNames
* @brief Group and sort a set of filenames
*
* vtkSortFileNames will take a list of filenames (e.g. from
* a file load dialog) and sort them into one or more series. If
* the input list of filenames contains any directories, these can
* be removed before sorting using the SkipDirectories flag. This
* class should be used where information about the series groupings
* can be determined by the filenames, but it might not be successful
* in cases where the information about the series groupings is
* stored in the files themselves (e.g DICOM).
* @sa
* vtkImageReader2
*/
#ifndef vtkSortFileNames_h
#define vtkSortFileNames_h
#include "vtkIOCoreModule.h" // For export macro
#include "vtkObject.h"
class vtkStringArray;
// this is a helper class defined in the .cxx file
class vtkStringArrayVector;
class VTKIOCORE_EXPORT vtkSortFileNames : public vtkObject
{
public:
vtkTypeMacro(vtkSortFileNames, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkSortFileNames* New();
//@{
/**
* Sort the file names into groups, according to similarity in
* filename name and path. Files in different directories,
* or with different extensions, or which do not fit into the same
* numbered series will be placed into different groups. This is
* off by default.
*/
vtkSetMacro(Grouping, vtkTypeBool);
vtkGetMacro(Grouping, vtkTypeBool);
vtkBooleanMacro(Grouping, vtkTypeBool);
//@}
//@{
/**
* Sort the files numerically, rather than lexicographically.
* For filenames that contain numbers, this means the order will be
* ["file8.dat", "file9.dat", "file10.dat"]
* instead of the usual alphabetic sorting order
* ["file10.dat" "file8.dat", "file9.dat"].
* NumericSort is off by default.
*/
vtkSetMacro(NumericSort, vtkTypeBool);
vtkGetMacro(NumericSort, vtkTypeBool);
vtkBooleanMacro(NumericSort, vtkTypeBool);
//@}
//@{
/**
* Ignore case when sorting. This flag is honored by both
* the sorting and the grouping. This is off by default.
*/
vtkSetMacro(IgnoreCase, vtkTypeBool);
vtkGetMacro(IgnoreCase, vtkTypeBool);
vtkBooleanMacro(IgnoreCase, vtkTypeBool);
//@}
//@{
/**
* Skip directories. If this flag is set, any input item that
* is a directory rather than a file will not be included in
* the output. This is off by default.
*/
vtkSetMacro(SkipDirectories, vtkTypeBool);
vtkGetMacro(SkipDirectories, vtkTypeBool);
vtkBooleanMacro(SkipDirectories, vtkTypeBool);
//@}
//@{
/**
* Set a list of file names to group and sort.
*/
void SetInputFileNames(vtkStringArray* input);
vtkGetObjectMacro(InputFileNames, vtkStringArray);
//@}
/**
* Get the full list of sorted filenames.
*/
virtual vtkStringArray* GetFileNames();
/**
* Get the number of groups that the names were split into, if
* grouping is on. The filenames are automatically split into
* groups, where the filenames in each group will be identical
* except for their series numbers. If grouping is not on, this
* method will return zero.
*/
virtual int GetNumberOfGroups();
/**
* Get the Nth group of file names. This method should only
* be used if grouping is on. If grouping is off, it will always
* return null.
*/
virtual vtkStringArray* GetNthGroup(int i);
/**
* Update the output filenames from the input filenames.
* This method is called automatically by GetFileNames()
* and GetNumberOfGroups() if the input names have changed.
*/
virtual void Update();
protected:
vtkSortFileNames();
~vtkSortFileNames() override;
vtkTypeBool NumericSort;
vtkTypeBool IgnoreCase;
vtkTypeBool Grouping;
vtkTypeBool SkipDirectories;
vtkTimeStamp UpdateTime;
vtkStringArray* InputFileNames;
vtkStringArray* FileNames;
vtkStringArrayVector* Groups;
/**
* Fill the output.
*/
virtual void Execute();
/**
* Sort the input string array, and append the results to the output.
*/
virtual void SortFileNames(vtkStringArray* input, vtkStringArray* output);
/**
* Separate a string array into groups and append them to the output.
*/
virtual void GroupFileNames(vtkStringArray* input, vtkStringArrayVector* output);
private:
vtkSortFileNames(const vtkSortFileNames&) = delete;
void operator=(const vtkSortFileNames&) = delete;
};
#endif