31 #include "DGtal/base/Common.h"
32 #include "DGtal/helpers/StdDefs.h"
33 #include "DGtal/io/viewers/Viewer3D.h"
34 #include "DGtal/io/DrawWithDisplay3DModifier.h"
35 #include "DGtal/io/readers/TableReader.h"
36 #include "DGtal/io/readers/PointListReader.h"
37 #include "DGtal/io/readers/MeshReader.h"
38 #include "DGtal/topology/helpers/Surfaces.h"
39 #include "DGtal/topology/SurfelAdjacency.h"
40 #include "DGtal/shapes/Mesh.h"
41 #include "DGtal/io/Color.h"
42 #include "DGtal/io/colormaps/HueShadeColorMap.h"
43 #include "DGtal/io/readers/GenericReader.h"
44 #include "DGtal/io/DrawWithDisplay3DModifier.h"
49 using namespace DGtal;
139 int displayCoordsCallBack(
void *viewer,
int name,
void *data)
141 vector<Z3i::RealPoint> *vectVoxels = (vector<Z3i::RealPoint> *)data;
142 std::stringstream ss;
143 ss <<
"Selected voxel: (" << (*vectVoxels)[name][0] <<
", ";
144 ss << (*vectVoxels)[name][1] <<
", ";
145 ss << (*vectVoxels)[name][2] <<
") ";
146 ((
Viewer *)viewer)->displayMessage(QString(ss.str().c_str()), 100000);
151 int main(
int argc,
char **argv)
155 std::string inputFileName;
156 std::vector<unsigned int> vectIndexSDP{0, 1, 2};
157 Color lineColor(100, 100, 250);
158 Color pointColor(250, 250, 250);
159 std::vector<int> vectColorPt;
160 std::vector<int> vectColorLine;
161 std::string meshName;
162 std::string typePrimitive{
"voxel"};
163 std::string vectorsFileName;
164 std::vector<double> vectSphereRadius;
165 std::vector<unsigned int> vectColMesh;
166 std::vector<unsigned int> vectIndexColorImport{3, 4, 5};
167 bool importColorLabels{
false};
168 bool noPointDisplay{
false};
169 bool drawLines{
false};
170 bool sphereRadiusFromInput{
true};
171 bool importColors{
false};
172 bool interactiveDisplayVoxCoords{
false};
176 unsigned int sphereResolution{30};
177 double sphereRadius{0.2};
178 double lineSize{0.2};
179 double filterValue{100.0};
180 double constantNorm{0.0};
181 double percentageFilterVect{100.0};
182 unsigned int customAlphaMesh;
184 unsigned int colorLabelIndex = 3;
186 app.description(
"Display sequence of 3d discrete points by using QGLviewer.");
187 app.add_option(
"-i,--input,1", inputFileName,
"input file: sdp (sequence of discrete points).")
189 ->check(CLI::ExistingFile);
190 app.add_option(
"--SDPindex", vectIndexSDP,
"specify the sdp index (by default 0,1,2).")
192 app.add_option(
"--pointColor,-c", vectColorPt,
"set the color of points: r g b a.")
194 app.add_option(
"--lineColor,-l", vectColorLine,
"set the color of line: r g b a.")
196 app.add_option(
"--addMesh,-m", meshName,
"append a mesh (off/obj) to the point set visualization.");
197 app.add_option(
"--customAlphaMesh", customAlphaMesh,
"set the alpha components of the colors of the mesh faces (can be applied for each mesh).");
198 auto optMesh = app.add_option(
"--customColorMesh", vectColMesh,
"set the R, G, B, A components of the colors of the mesh faces (mesh added with option --addMesh).")
200 auto importColOpt = app.add_flag(
"--importColors", importColors,
"import point colors from the input file (R G B colors should be by default at index 3, 4, 5).");
201 app.add_option(
"--setColorsIndex", vectIndexColorImport,
"customize the index of the imported colors in the source file (used by --importColor). By default the initial indexes are 3, 4, 5.")
203 ->needs(importColOpt);
205 app.add_flag(
"--importColorLabels", importColorLabels,
"import color labels from the input file (label index should be by default at index 3).");
206 app.add_option(
"--setColorLabelIndex", colorLabelIndex,
"customize the index of the imported color labels in the source file (used by -importColorLabels).",
true);
207 app.add_option(
"--filter,-f", filterValue,
"filter input file in order to display only the [arg] percent of the input 3D points (uniformly selected).",
true);
208 app.add_flag(
"--noPointDisplay", noPointDisplay,
"usefull for instance to only display the lines between points.");
209 app.add_flag(
"--drawLines", drawLines,
"draw the line between discrete points.");
210 app.add_option(
"--scaleX,-x", sx,
"set the scale value in the X direction",
true);
211 app.add_option(
"--scaleY,-y", sy,
"set the scale value in the Y direction",
true);
212 app.add_option(
"--scaleZ,-z", sy,
"set the scale value in the Z direction",
true);
213 app.add_option(
"--sphereResolution", sphereResolution,
"defines the sphere resolution (used when the primitive is set to the sphere).",
true);
214 app.add_option(
"-s,--sphereRadius", sphereRadius,
"defines the sphere radius (used when the primitive is set to the sphere).",
true);
215 app.add_flag(
"--sphereRadiusFromInput", sphereRadiusFromInput,
"takes, as sphere radius, the 4th field of the sdp input file.");
216 app.add_option(
"--lineSize", lineSize,
"defines the line size (used when the --drawLines or --drawVectors option is selected).",
true);
217 app.add_option(
"--primitive,-p", typePrimitive,
"set the primitive to display the set of points.",
true)
218 ->check(CLI::IsMember({
"voxel",
"glPoints",
"sphere"}));
219 app.add_option(
"--drawVectors,-v", vectorsFileName,
"SDP vector file: draw a set of vectors from the given file (each vector are determined by two consecutive point given, each point represented by its coordinates on a single line.");
221 app.add_option(
"--unitVector,-u", constantNorm,
"specifies that the SDP vector file format (of --drawVectors option) should be interpreted as unit vectors (each vector position is be defined from the input point (with input order) with a constant norm defined by [arg]).",
true);
223 app.add_option(
"--filterVectors", percentageFilterVect,
"filters vector input file in order to display only the [arg] percent of the input vectors (uniformly selected, to be used with option --drawVectors else no effect). ",
true);
224 app.add_flag(
"--interactiveDisplayVoxCoords", interactiveDisplayVoxCoords,
" by using this option the coordinates can be displayed after selection (shift+left click on voxel).");
226 app.get_formatter()->column_width(40);
227 CLI11_PARSE(app, argc, argv);
230 if (vectColorLine.size() == 4)
232 lineColor.setRGBi(vectColorLine[0], vectColorLine[1], vectColorLine[2], vectColorLine[3]);
234 if (vectColorPt.size() == 4)
236 pointColor.setRGBi(vectColorPt[0], vectColorPt[1], vectColorPt[2], vectColorPt[3]);
239 QApplication application(argc, argv);
241 bool useUnitVector = constantNorm != 0.0;
246 viewer.setWindowTitle(
"3dSPD Viewer");
248 viewer.setGLScale(sx, sy, sz);
249 viewer.myGLLineMinWidth = lineSize;
253 std::vector<Color> vectColors;
259 for (
unsigned int i = 0; i < r.size(); i++)
261 vectColors.push_back(
Color(r[i], g[i], b[i]));
266 std::vector<int> vectColorLabels;
267 unsigned int maxLabel = 1;
268 if (importColorLabels)
271 maxLabel = *(std::max_element(vectColorLabels.begin(), vectColorLabels.end()));
275 if (sphereRadiusFromInput)
280 vector<Z3i::RealPoint> vectVoxels;
286 if (typePrimitive ==
"glPoints")
288 viewer.setUseGLPointForBalls(
true);
291 int step = max(1, (
int)(100 / filterValue));
292 for (
unsigned int i = 0; i < vectVoxels.size(); i = i + step)
296 Color col = vectColors[i];
297 viewer.setFillColor(col);
299 else if (importColorLabels)
301 unsigned int index = vectColorLabels[i];
302 Color col = aColorMap(index);
303 viewer.setFillColor(col);
306 if (typePrimitive ==
"voxel")
308 if (interactiveDisplayVoxCoords)
312 viewer <<
Z3i::Point((
int)vectVoxels.at(i)[0],
313 (
int)vectVoxels.at(i)[1],
314 (
int)vectVoxels.at(i)[2]);
318 viewer.addBall(vectVoxels.at(i), sphereRadius, sphereResolution);
325 for (
unsigned int i = 1; i < vectVoxels.size(); i++)
327 viewer.addLine(vectVoxels.at(i - 1), vectVoxels.at(i), lineSize);
331 if (vectorsFileName !=
"")
334 if (vectorsPt.size() % 2 == 1)
336 trace.
info() <<
"Warning the two set of points doesn't contains the same number of points, some vectors will be skipped." << std::endl;
339 double percentage = percentageFilterVect;
340 int step = max(1, (
int)(100 / percentage));
344 for (
unsigned int i = 0; i < std::min(vectVoxels.size(), vectorsPt.size()); i = i + 2 * step)
346 viewer.addLine(vectVoxels.at(i), vectVoxels.at(i) + vectorsPt.at(i) * constantNorm, lineSize);
351 for (
unsigned int i = 0; i < vectorsPt.size() - 1; i = i + 2 * step)
353 viewer.addLine(vectorsPt.at(i), vectorsPt.at(i + 1), lineSize);
359 bool customColorMesh = vectColMesh.size() == 4;
362 viewer.setFillColor(
DGtal::Color(vectColMesh[0], vectColMesh[1], vectColMesh[2], vectColMesh[3]));
368 for (
unsigned int j = 0; j < mesh.nbFaces(); j++)
370 auto c = mesh.getFaceColor(j);
371 mesh.setFaceColor(j,
Color(c.red(), c.green(), c.blue(), customAlphaMesh));
375 if (interactiveDisplayVoxCoords)
377 viewer <<
SetSelectCallback3D(displayCoordsCallBack, &vectVoxels, 0, vectVoxels.size() - 1);
380 viewer << Viewer3D<>::updateDisplay;
381 return application.exec();
int main(int argc, char **argv)
Trace trace(traceWriterTerm)