Skip to content

Commit 180f5e7

Browse files
authored
Merge pull request #467 from BDoignies/main2.0
Main2.0
2 parents 00bb416 + ca7fb8f commit 180f5e7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+558
-2488
lines changed

.github/workflows/buildAndDocumentation.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ env:
1010
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
1111
BUILD_TYPE: Release
1212
CONFIG_GLOBAL:
13-
CONFIG_LINUX: -DWITH_MAGICK=true -DWITH_GMP=true -DWITH_FFTW3=true -DWARNING_AS_ERROR=ON -DWITH_HDF5=true -DWITH_QGLVIEWER=true -DWITH_CAIRO=true -DWITH_EIGEN=true -DDGTAL_ENABLE_FLOATING_POINT_EXCEPTIONS=true
14-
CONFIG_MAC: -DWITH_EIGEN=true -DWITH_GMP=tue
15-
CONFIG_WINDOWS: -DWITH_OPENMP=true -DENABLE_CONAN=true -DDISABLE_POLYSCOPE=ON #-DWITH_FFTW3=true #-DWITH_CAIRO=true #-DWITH_ITK=true -DWITH_GMP=true
13+
CONFIG_LINUX: -DWITH_MAGICK=true -DWITH_GMP=true -DDGTAL_WITH_FFTW3=true -DWARNING_AS_ERROR=ON -DDGTAL_WITH_HDF5=true -DWITH_QGLVIEWER=true -DDGTAL_WITH_CAIRO=true -DDGTAL_WITH_EIGEN=true -DDGTAL_ENABLE_FLOATING_POINT_EXCEPTIONS=true
14+
CONFIG_MAC: -DDGTAL_WITH_EIGEN=true -DWITH_GMP=tue
15+
CONFIG_WINDOWS: -DDGTAL_WITH_OPENMP=true -DENABLE_CONAN=true -DDISABLE_POLYSCOPE=ON #-DDGTAL_WITH_FFTW3=true #-DDGTAL_WITH_CAIRO=true #-DDGTAL_WITH_ITK=true -DWITH_GMP=true
1616

1717

1818
jobs:

CMakeLists.txt

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,22 @@
22
# -----------------------------------------------------------------------------
33
# Project definition
44
# -----------------------------------------------------------------------------
5+
cmake_minimum_required (VERSION 3.20)
56
PROJECT(DGtalTools)
67

7-
cmake_minimum_required (VERSION 3.11)
88
cmake_policy(SET CMP0057 NEW) # the new interpretation of IN_LIST is by default not set (at least until 3.21.1).
99

10-
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
10+
LIST(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
1111
SET(DGTALTOOLS_RANDOMIZED_BUILD_THRESHOLD "100" CACHE INTERNAL "Threshold for the random selection of tools to build.")
1212
SET(DGTALTOOLS_RANDOMIZED_BUILD_WHITELIST "" CACHE INTERNAL "List of whitelisted tools to build.")
1313
option(NO_ADD_STBIMAGE_IMPLEMENT "To avoid duplicated linking errors (like LNK2005 in MSVC)" OFF)
1414
option(DISABLE_POLYSCOPE "Disable polyscope based tools" OFF)
1515

1616

17-
1817
# -----------------------------------------------------------------------------
19-
# DGtal dependencies
18+
# CPP20
2019
# -----------------------------------------------------------------------------
21-
message(STATUS "-------------------------------------------------------------------------------")
22-
message(STATUS "Checking if DGtal is installed:")
23-
FIND_PACKAGE(DGtal 1.4 REQUIRED)
24-
INCLUDE_DIRECTORIES(${DGTAL_INCLUDE_DIRS})
25-
LINK_DIRECTORIES(${DGTAL_LIBRARY_DIRS})
26-
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
27-
message(STATUS "DGtal found.")
28-
29-
30-
31-
# -----------------------------------------------------------------------------
32-
# CPP17
33-
# -----------------------------------------------------------------------------
34-
set(DGTALTOOLS_CMAKE_CXX_STANDARD_MIN_REQUIRED 17)
20+
set(DGTALTOOLS_CMAKE_CXX_STANDARD_MIN_REQUIRED 20)
3521
if(NOT CMAKE_CXX_STANDARD)
3622
set(CMAKE_CXX_STANDARD ${DGTALTOOLS_CMAKE_CXX_STANDARD_MIN_REQUIRED})
3723
else()
@@ -44,8 +30,19 @@ endif()
4430
if(NOT CMAKE_CXX_STANDARD_REQUIRED)
4531
set(CMAKE_CXX_STANDARD_REQUIRED ON)
4632
endif()
33+
message(STATUS "C++ standard set to ${CMAKE_CXX_STANDARD}")
4734

4835

36+
# -----------------------------------------------------------------------------
37+
# DGtal dependencies
38+
# -----------------------------------------------------------------------------
39+
message(STATUS "-------------------------------------------------------------------------------")
40+
message(STATUS "Checking if DGtal is installed:")
41+
FIND_PACKAGE(DGtal 2.0.0 REQUIRED)
42+
INCLUDE_DIRECTORIES(${DGTAL_INCLUDE_DIRS})
43+
LINK_DIRECTORIES(${DGTAL_LIBRARY_DIRS})
44+
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
45+
message(STATUS "DGtal found.")
4946

5047

5148
# -------------------------------------------------------------------------
@@ -102,9 +99,9 @@ message(STATUS "----------------------------------------------------------------
10299
#-----------------------------------------------------------------------------
103100
# ITK setting
104101
#-----------------------------------------------------------------------------
105-
if ( WITH_ITK )
102+
if ( DGTAL_WITH_ITK )
106103
include(${ITK_USE_FILE})
107-
ENDIF( WITH_ITK )
104+
ENDIF( DGTAL_WITH_ITK )
108105

109106

110107

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ scripts. This script generates a new empty tool containing only these minimal fe
8888
```c++
8989
std::stringstream ss;
9090
ss << "Usage: " << argv[0] << " [options] input\n"
91-
<< "Display a 3D curve given as the <input> filename (with possibly projections and/or tangent information) by using QGLviewer.\n"
91+
<< "Display a 3D curve given as the <input> filename (with possibly projections and/or tangent information) by using PolyscopeViewer.\n"
9292
<< general_opt << "\n\n";
9393
ss << "Example:\n"
9494
<< "3dCurveViewer -C -b 1 -3 -2 -c ${DGtal}/examples/samples/sinus.dat\n";

ChangeLog.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
# DGtalTools 1.5 (beta)
1+
# DGtalTools 2.0
2+
3+
- *build*
4+
- Update from DGtal 2.0 (cmake and tools env variable) (Bastien Doignies, [#467](https://github.com/DGtal-team/DGtalTools/pull/467))
5+
6+
7+
# DGtalTools 1.5
28

39
- *build*
410
- Fix DGtalTools doc deployement.

converters/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,22 @@ SET(DGTAL_TOOLS_SRC
2323
vol2vox
2424
mesh2vol)
2525

26-
if( WITH_HDF5 )
26+
if( DGTAL_WITH_HDF5 )
2727
SET(DGTAL_TOOLS_SRC ${DGTAL_TOOLS_SRC}
2828
raw2HDF5
2929
HDF52vol)
30-
endif( WITH_HDF5 )
30+
endif( DGTAL_WITH_HDF5 )
3131

3232
FOREACH(FILE ${DGTAL_TOOLS_SRC})
3333
DGtalTools_add_tool(${FILE})
3434
ENDFOREACH(FILE)
3535

3636

37-
if ( WITH_ITK )
37+
if ( DGTAL_WITH_ITK )
3838
SET(DGTAL_TOOLS_ITK
3939
dicom2vol
4040
itk2vol)
4141
FOREACH(FILE ${DGTAL_TOOLS_ITK})
4242
DGtalTools_add_tool(${FILE})
4343
ENDFOREACH(FILE)
44-
ENDIF( WITH_ITK )
44+
ENDIF( DGTAL_WITH_ITK )

converters/vol2heightfield.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ using namespace DGtal;
5858
@code
5959
6060
Positionals:
61-
1 TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
61+
1 TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
6262
2 TEXT=result.pgm resulting image filename (in pgm or other).
6363
6464
6565
Options:
6666
-h,--help Print this help message and exit
67-
-i,--input TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
67+
-i,--input TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
6868
-o,--output TEXT resulting image filename (in pgm or other)
6969
-m,--thresholdMin INT=128 threshold min (excluded) to define binary shape.
7070
-M,--thresholdMax INT=255 threshold max (included) to define binary shape.
@@ -124,7 +124,7 @@ int main( int argc, char** argv )
124124
bool bgLastDepth = false;
125125

126126
app.description("Convert volumetric file into a projected 2D image given from a normal direction N and from a starting point P. The 3D volume is scanned in this normal direction N starting from P with a step 1. If the intensity of the 3d point is inside the given thresholds its 2D gray values are set to the current scan number.\n Example:\n vol2heightfield -i ${DGtal}/examples/samples/lobster.vol -m 60 -M 500 --nx 0 --ny 0.7 --nz -1 -x 150 -y 0 -z 150 --width 300 --height 300 --heightFieldMaxScan 350 -o resultingHeightMap.pgm");
127-
app.add_option("-i,--input,1", inputFileName, "vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255." )
127+
app.add_option("-i,--input,1", inputFileName, "vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255." )
128128
->required()
129129
->check(CLI::ExistingFile);
130130
app.add_option("-o,--output,2", outputFileName, "resulting image filename (in pgm or other).");

converters/vol2obj.cpp

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
#include "DGtal/base/Common.h"
3030
#include "DGtal/helpers/StdDefs.h"
3131
#include "DGtal/io/readers/GenericReader.h"
32-
#include "DGtal/io/boards/Board3D.h"
33-
#include "DGtal/io/DrawWithDisplay3DModifier.h"
3432
#include "DGtal/io/readers/PointListReader.h"
3533

3634
#include "DGtal/images/ImageSelector.h"
@@ -56,12 +54,12 @@ between
5654
@code
5755
5856
Positionals:
59-
1 TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d or .sdp and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
57+
1 TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d or .sdp and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
6058
2 TEXT output file (.obj or .off).
6159
6260
Options:
6361
-h,--help Print this help message and exit
64-
-i,--input TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d or .sdp and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
62+
-i,--input TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d or .sdp and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
6563
-o,--output TEXT output file (.obj or .off).
6664
-m,--thresholdMin INT=128 threshold min (excluded) to define binary shape.
6765
-M,--thresholdMax INT=255 threshold max (included) to define binary shape.
@@ -76,6 +74,47 @@ vol2obj.cpp
7674
*/
7775
///////////////////////////////////////////////////////////////////////////////
7876

77+
using Vertices = std::vector<std::array<double, 3>>;
78+
using Faces = std::vector<std::array<size_t, 3>>;
79+
80+
template<typename T>
81+
void pushCube(const T& center, Vertices& vertices, Faces& faces) {
82+
constexpr static double size = 0.5;
83+
constexpr static std::array<std::array<double, 3>, 8> coords {{
84+
{-size, -size, -size},
85+
{ size, -size, -size},
86+
{ size, size, -size},
87+
{-size, size, -size},
88+
{-size, -size, size},
89+
{ size, -size, size},
90+
{ size, size, size},
91+
{-size, size, size}
92+
}};
93+
constexpr static std::array<std::array<size_t, 3>, 12> indices {{
94+
{0, 1, 3}, {1, 2, 3},
95+
{0, 1, 4}, {1, 5, 4},
96+
{1, 2, 5}, {2, 6, 5},
97+
{3, 7, 2}, {7, 6, 2},
98+
{4, 5, 7}, {5, 6, 7},
99+
{0, 4, 3}, {4, 7, 3}
100+
}};
101+
102+
const double x = center[0];
103+
const double y = center[1];
104+
const double z = center[2];
105+
106+
const size_t startIndex = vertices.size() + 1;
107+
for (size_t i = 0; i < coords.size(); ++i) {
108+
vertices.push_back({x + coords[i][0],
109+
y + coords[i][1],
110+
z + coords[i][2]});
111+
}
112+
for (size_t i = 0; i < indices.size(); ++i) {
113+
faces.push_back({startIndex + indices[i][0],
114+
startIndex + indices[i][1],
115+
startIndex + indices[i][2]});
116+
}
117+
}
79118

80119
int main( int argc, char** argv )
81120
{
@@ -91,7 +130,7 @@ int main( int argc, char** argv )
91130

92131

93132
app.description(" Converts any volumetric file (or .sdp file) to an OBJ one. Each grid point with value between [thresholdMin, thresholdMax] is exported as a unit cube.");
94-
app.add_option("-i,--input,1", inputFileName, "vol file (.vol, .longvol .p3d, .pgm3d or .sdp and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255." )
133+
app.add_option("-i,--input,1", inputFileName, "vol file (.vol, .longvol .p3d, .pgm3d or .sdp and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255." )
95134
->required()
96135
->check(CLI::ExistingFile);
97136
app.add_option("--output,-o,2",outputFileName ,"output file (.obj or .off).");
@@ -104,9 +143,9 @@ int main( int argc, char** argv )
104143
app.get_formatter()->column_width(40);
105144
CLI11_PARSE(app, argc, argv);
106145
// END parse command line using CLI ----------------------------------------------
107-
108-
109-
Board3D<> board;
146+
147+
Vertices vertices;
148+
Faces faces;
110149

111150
typedef ImageSelector<Domain, unsigned char>::Type Image;
112151
string extension = inputFileName.substr(inputFileName.find_last_of(".") + 1);
@@ -122,7 +161,7 @@ int main( int argc, char** argv )
122161
for(Domain::ConstIterator it = domain.begin(), itend=domain.end(); it!=itend; ++it){
123162
unsigned char val= image( (*it) );
124163
if(val<=thresholdMax && val >=thresholdMin){
125-
board << *it;
164+
pushCube(*it, vertices, faces);
126165
}
127166
}
128167
}
@@ -131,10 +170,24 @@ int main( int argc, char** argv )
131170
{
132171
vector<Z3i::Point> vectVoxels = PointListReader<Z3i::Point>::getPointsFromFile(inputFileName);
133172
for(unsigned int i=0;i< vectVoxels.size(); i++){
134-
board << vectVoxels.at(i);
173+
pushCube(vectVoxels.at(i), vertices, faces);
135174
}
136175
}
176+
177+
// Export file
178+
std::ofstream outFile(outputFileName);
179+
if (!outFile) {
180+
trace.error() << "Can not open file: '" << outputFileName << "'\n";
181+
return EXIT_FAILURE;
182+
}
183+
184+
outFile << "#This file was created by DGtalTools vol2obj object\n";
185+
for (size_t i = 0; i < vertices.size(); ++i) {
186+
outFile << "v " << vertices[i][0] << ' ' << vertices[i][1] << ' ' << vertices[i][2] << '\n';
187+
}
188+
for (size_t i = 0; i < faces.size(); ++i) {
189+
outFile << "f " << faces[i][0] << ' ' << faces[i][1] << ' ' << faces[i][2] << '\n';
190+
}
137191

138-
board.saveOBJ(outputFileName);
139192
return EXIT_SUCCESS;
140193
}

converters/vol2raw.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ using namespace Z3i;
5454
Usage: ./converters/vol2raw [OPTIONS] 1 [2]
5555
5656
Positionals:
57-
1 TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
57+
1 TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
5858
2 TEXT output file (.raw).
5959
6060
Options:
6161
-h,--help Print this help message and exit
62-
-i,--input TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
62+
-i,--input TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
6363
-o,--output TEXT output file (.raw).
6464
--rescaleInputMin INT=0 min value used to rescale the input intensity (to avoid basic cast into 8 bits image).
6565
--rescaleInputMax INT=255 max value used to rescale the input intensity (to avoid basic cast into 8 bits image).
@@ -101,7 +101,7 @@ int main(int argc, char**argv)
101101
DGtal::int64_t rescaleInputMax {255};
102102

103103
app.description("Convert a vol to a 8-bit raw file.\n Example: vol2raw ${DGtal}/examples/samples/lobster.vol res.raw \n");
104-
app.add_option("-i,--input,1", inputFileName, "vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255." )
104+
app.add_option("-i,--input,1", inputFileName, "vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255." )
105105
->required()
106106
->check(CLI::ExistingFile);
107107
app.add_option("--output,-o,2",outputFileName ,"output file (.raw).");

converters/vol2sdp.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ using namespace DGtal;
5656
Usage: ./converters/vol2sdp [OPTIONS] 1 [2]
5757
5858
Positionals:
59-
1 TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd) or sdp (sequence of discrete points). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
59+
1 TEXT:FILE REQUIRED vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd) or sdp (sequence of discrete points). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
6060
2 TEXT=result.sdp sequence of discrete point file (.sdp)
6161
6262
Options:
6363
-h,--help Print this help message and exit
6464
-i,--input TEXT:FILE REQUIRED
65-
vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd) or sdp (sequence of discrete points).
65+
vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd) or sdp (sequence of discrete points).
6666
For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255.
6767
-o,--output TEXT=result.sdp sequence of discrete point file (.sdp)
6868
-e,--exportImageValues option to export also the image value of the voxel in a fourth field.
@@ -102,7 +102,7 @@ int main( int argc, char** argv )
102102

103103
// parse command line using CLI ----------------------------------------------
104104
app.description("Convert volumetric file into a digital set of points from a given threshold.\n vol2sdp -i ${DGtal}/examples/samples/lobster.vol -o volumeList.sdp");
105-
app.add_option("-i,--input,1", inputFilename, "vol file (.vol, .longvol .p3d, .pgm3d and if WITH_ITK is selected: dicom, dcm, mha, mhd) or sdp (sequence of discrete points). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255." )
105+
app.add_option("-i,--input,1", inputFilename, "vol file (.vol, .longvol .p3d, .pgm3d and if DGTAL_WITH_ITK is selected: dicom, dcm, mha, mhd) or sdp (sequence of discrete points). For longvol, dicom, dcm, mha or mhd formats, the input values are linearly scaled between 0 and 255." )
106106
->required()
107107
->check(CLI::ExistingFile);
108108
app.add_option("--output,-o,2", outputFilename, "sequence of discrete point file (.sdp)", true);

0 commit comments

Comments
 (0)