ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ScalarFieldCollector.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "ScalarFieldCollector.h"
9 
10 // qCC_db
11 #include <ecvPointCloud.h>
12 
13 // CCLib
14 #include <ScalarField.h>
15 
16 // system
17 #include <assert.h>
18 
21  Behavior behavior) {
22  assert(!scalarFields.contains(sf));
23  // if (scalarFields.contains(sf))
24  // CVLog::Warning(QString("[SFCollector] scalar field '%1' HAS
25  // ALREADY BEEN COLLECTED").arg(sf->getName()) + ", behaviour " +
26  // QString::number(behavior)); else
27  // CVLog::Warning(QString("[SFCollector] collect scalar field
28  // '%1'").arg(sf->getName()) + ", behaviour " + QString::number(behavior));
29  SFDesc desc;
30  desc.behavior = behavior;
31  desc.cloud = cloud;
32  scalarFields[sf] = desc;
33 }
34 
35 void SFCollector::releaseSFs(bool keepByDefault) {
36  for (Map::iterator it = scalarFields.begin(); it != scalarFields.end();
37  ++it) {
38  const SFDesc& desc = it.value();
39  cloudViewer::ScalarField* sf = it.key();
40 
41  if (desc.behavior == ALWAYS_KEEP ||
42  (keepByDefault && desc.behavior == CAN_REMOVE)) {
43  // CVLog::Warning(QString("[SFCollector] Keep scalar field '%1' on
44  // cloud '%2'").arg(sf->getName()).arg(desc.cloud->getName()));
45  // keep this SF
46  continue;
47  }
48 
49  int sfIdx = desc.cloud->getScalarFieldIndexByName(sf->getName());
50  if (sfIdx >= 0) {
51  // CVLog::Warning(QString("[SFCollector] Remove scalar field '%1'
52  // from '%2'").arg(sf->getName()).arg(desc.cloud->getName()));
53  desc.cloud->deleteScalarField(sfIdx);
54  } else {
55  // CVLog::Warning(QString("[SFCollector] Scalar field '%1' can't be
56  // found anymore on cloud '%2', impossible to remove
57  // it").arg(sf->getName()).arg(desc.cloud->getName()));
58  }
59  }
60 
61  scalarFields.clear();
62 }
63 
65  if (scalarFields.contains(sf)) {
66  // Behavior previousBehavior = scalarFields[sf].behavior;
67  scalarFields[sf].behavior = behavior;
68  // CVLog::Warning("behavior of " + QString(sf->getName()) +
69  //" changed from " + QString::number(previousBehavior) + " to " +
70  // QString::number(behavior));
71  }
72 
73  return true;
74 }
void push(ccPointCloud *cloud, cloudViewer::ScalarField *sf, Behavior behavior)
bool setBehavior(cloudViewer::ScalarField *sf, Behavior behavior)
void releaseSFs(bool keepByDefault)
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
void deleteScalarField(int index) override
Deletes a specific scalar field.
int getScalarFieldIndexByName(const char *name) const
Returns the index of a scalar field represented by its name.
A simple scalar field (to be associated to a point cloud)
Definition: ScalarField.h:25
const char * getName() const
Returns scalar field name.
Definition: ScalarField.h:43