ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
PDMSFilter.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 "PDMSFilter.h"
9 
10 #include "PdmsParser.h"
11 
12 // CV_DB_LIB
13 #include <CVLog.h>
14 #include <assert.h>
15 #include <ecvBox.h>
16 #include <ecvCone.h>
17 #include <ecvCylinder.h>
18 #include <ecvDish.h>
19 #include <ecvExtru.h>
20 #include <ecvMesh.h>
21 #include <ecvPointCloud.h>
22 #include <ecvTorus.h>
23 
24 using namespace cloudViewer;
25 
27  std::pair<PdmsTools::PdmsObjects::GenericItem*, ccHObject*>;
28 
30  : FileIOFilter({"_PDMS Filter",
31  DEFAULT_PRIORITY, // priority
32  QStringList{"pdms", "pdmsmac", "mac"}, "pdms",
33  QStringList{"PDMS primitives (*.pdms *.pdmsmac *.mac)"},
34  QStringList(), Import}) {}
35 
37  ccHObject& container,
38  LoadParameters& parameters) {
39  PdmsParser parser;
40  PdmsFileSession session(
41  qPrintable(filename)); // DGM: warning, toStdString doesn't
42  // preserve "local" characters
43 
44  parser.linkWithSession(&session);
45  if (parser.parseSessionContent()) {
47  parser.getLoadedObject(true);
48  assert(pdmsmodel);
49 
50  std::vector<PdmsAndCCPair> treeSync;
51  treeSync.push_back(PdmsAndCCPair(pdmsmodel, &container));
52 
53  while (!treeSync.empty()) {
54  PdmsAndCCPair currentPair = treeSync.back();
55  treeSync.pop_back();
56 
57  if (currentPair.first->isGroupElement()) {
60  currentPair.first);
61 
62  // primitives
63  {
64  for (std::list<PdmsTools::PdmsObjects::DesignElement*>::
65  const_iterator it = group->elements.begin();
66  it != group->elements.end(); ++it)
67  treeSync.push_back(
68  PdmsAndCCPair(*it, currentPair.second));
69  }
70 
71  // sub-groups
72  {
73  for (std::list<PdmsTools::PdmsObjects::GroupElement*>::
74  const_iterator it =
75  group->subhierarchy.begin();
76  it != group->subhierarchy.end(); ++it) {
77  ccHObject* subGroup = new ccHObject((*it)->name);
78  currentPair.second->addChild(subGroup);
79 
80  treeSync.push_back(PdmsAndCCPair(*it, subGroup));
81  }
82  }
83  } else {
84  // Convert PDMS GenericItem to the corresponding ccHObject
85  ccMesh* primitive = nullptr;
86  QString unsupportedPrimitiveStr("unknown");
87  switch (currentPair.first->getType()) {
88  case PDMS_SCYLINDER: {
91  currentPair.first);
92  primitive = new ccCylinder(pdmsCyl->diameter / 2,
93  pdmsCyl->height, 0,
94  pdmsCyl->name);
95  } break;
96  case PDMS_CTORUS: {
98  static_cast<PdmsTools::PdmsObjects::CTorus*>(
99  currentPair.first);
100  primitive = new ccTorus(pdmsCTor->inside_radius,
101  pdmsCTor->outside_radius,
102  pdmsCTor->angle ,
103  false, 0, 0, pdmsCTor->name);
104  } break;
105  case PDMS_RTORUS: {
107  static_cast<PdmsTools::PdmsObjects::RTorus*>(
108  currentPair.first);
109  primitive = new ccTorus(pdmsRTor->inside_radius,
110  pdmsRTor->outside_radius,
111  pdmsRTor->angle ,
112  false, pdmsRTor->height, 0,
113  pdmsRTor->name);
114  } break;
115  case PDMS_DISH: {
116  PdmsTools::PdmsObjects::Dish* pdmsDish =
117  static_cast<PdmsTools::PdmsObjects::Dish*>(
118  currentPair.first);
119  primitive = new ccDish(
120  pdmsDish->diameter / 2, pdmsDish->height,
121  pdmsDish->radius, 0, pdmsDish->name);
122  } break;
123  case PDMS_CONE: {
124  PdmsTools::PdmsObjects::Cone* pdmsCone =
125  static_cast<PdmsTools::PdmsObjects::Cone*>(
126  currentPair.first);
127  primitive = new ccCone(
128  pdmsCone->dbottom / 2, pdmsCone->dtop / 2,
129  pdmsCone->height, 0, 0, 0, pdmsCone->name);
130  } break;
131  case PDMS_PYRAMID:
132  unsupportedPrimitiveStr = "Pyramid";
133  break;
134  case PDMS_SNOUT: {
135  PdmsTools::PdmsObjects::Snout* pdmsSnout =
136  static_cast<PdmsTools::PdmsObjects::Snout*>(
137  currentPair.first);
138  primitive = new ccCone(
139  pdmsSnout->dbottom / 2, pdmsSnout->dtop / 2,
140  pdmsSnout->height, pdmsSnout->xoff,
141  pdmsSnout->yoff, 0, pdmsSnout->name);
142  } break;
143  case PDMS_BOX: {
144  PdmsTools::PdmsObjects::Box* pdmsBox =
145  static_cast<PdmsTools::PdmsObjects::Box*>(
146  currentPair.first);
147  primitive =
148  new ccBox(pdmsBox->lengths, 0, pdmsBox->name);
149  } break;
150  case PDMS_NBOX:
151  unsupportedPrimitiveStr = "NBox";
152  break;
153  case PDMS_EXTRU: {
155  static_cast<PdmsTools::PdmsObjects::Extrusion*>(
156  currentPair.first);
157  size_t count = pdmsExtru->loop->loop.size();
158  if (count) {
159  std::vector<CCVector2> profile;
160  profile.reserve(count);
161  for (std::list<PdmsTools::PdmsObjects::Vertex*>::
162  const_iterator it =
163  pdmsExtru->loop->loop.begin();
164  it != pdmsExtru->loop->loop.end(); ++it)
165  profile.push_back((*it)->v);
166 
167  primitive = new ccExtru(profile, pdmsExtru->height,
168  0, pdmsExtru->name);
169  }
170  } break;
171  case PDMS_NEXTRU:
172  unsupportedPrimitiveStr = "NExtru";
173  break;
174  case PDMS_LOOP:
175  unsupportedPrimitiveStr = "Loop";
176  break;
177  case PDMS_VERTEX:
178  unsupportedPrimitiveStr = "Vertex";
179  break;
180 
181  default:
182  break;
183  }
184 
185  if (primitive) {
186  // transformation
187  ccGLMatrix trans;
188  assert(currentPair.first->isCoordinateSystemUpToDate);
189  trans.setTranslation(currentPair.first->position);
190  for (unsigned c = 0; c < 3; ++c)
191  for (unsigned l = 0; l < 3; ++l)
192  trans.getColumn(c)[l] = static_cast<float>(
193  currentPair.first->orientation[c].u[l]);
194 
195  primitive->setGLTransformation(trans);
196  primitive->setVisible(true);
197  currentPair.second->addChild(primitive);
198  } else {
199  CVLog::Warning(QString("[PDMSFilter] Primitive '%1' not "
200  "supported yet!")
201  .arg(unsupportedPrimitiveStr));
202  }
203  }
204  }
205  } else {
206  return CC_FERR_MALFORMED_FILE;
207  }
208 
210 
211  return CC_FERR_NO_ERROR;
212 }
std::string filename
int count
CC_FILE_ERROR
Typical I/O filter errors.
Definition: FileIOFilter.h:20
@ CC_FERR_MALFORMED_FILE
Definition: FileIOFilter.h:32
@ CC_FERR_NO_ERROR
Definition: FileIOFilter.h:21
CloudViewerScene::LightingProfile profile
std::pair< PdmsTools::PdmsObjects::GenericItem *, ccHObject * > PdmsAndCCPair
Definition: PDMSFilter.cpp:27
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
Definition: CVLog.cpp:133
Generic file I/O filter.
Definition: FileIOFilter.h:46
static constexpr float DEFAULT_PRIORITY
Definition: FileIOFilter.h:313
virtual CC_FILE_ERROR loadFile(const QString &filename, ccHObject &container, LoadParameters &parameters) override
Loads one or more entities from a file.
Definition: PDMSFilter.cpp:36
bool parseSessionContent()
Definition: PdmsParser.cpp:568
void linkWithSession(PdmsLexer *s)
Definition: PdmsParser.cpp:470
PdmsObjects::GenericItem * getLoadedObject(bool forgetIt=true)
Definition: PdmsParser.cpp:593
Torus (circular section)
Definition: PdmsTools.h:283
PointCoordinateType angle
Definition: PdmsTools.h:287
PointCoordinateType outside_radius
Definition: PdmsTools.h:286
PointCoordinateType inside_radius
Definition: PdmsTools.h:285
PointCoordinateType dbottom
Definition: PdmsTools.h:337
PointCoordinateType height
Definition: PdmsTools.h:338
PointCoordinateType dtop
Definition: PdmsTools.h:336
PointCoordinateType height
Definition: PdmsTools.h:320
PointCoordinateType radius
Definition: PdmsTools.h:321
PointCoordinateType diameter
Definition: PdmsTools.h:319
PointCoordinateType height
Definition: PdmsTools.h:439
char name[c_max_str_length]
Name.
Definition: PdmsTools.h:157
std::list< DesignElement * > elements
Definition: PdmsTools.h:231
std::list< GroupElement * > subhierarchy
Definition: PdmsTools.h:232
std::list< Vertex * > loop
Definition: PdmsTools.h:416
PointCoordinateType height
Definition: PdmsTools.h:304
PointCoordinateType height
Definition: PdmsTools.h:258
PointCoordinateType diameter
Definition: PdmsTools.h:257
PointCoordinateType xoff
Definition: PdmsTools.h:368
PointCoordinateType yoff
Definition: PdmsTools.h:368
Box (primitive)
Definition: ecvBox.h:16
Cone (primitive)
Definition: ecvCone.h:16
Cylinder (primitive)
Definition: ecvCylinder.h:16
Dish.
Definition: ecvDish.h:16
virtual void setVisible(bool state)
Sets entity visibility.
virtual void setGLTransformation(const ccGLMatrix &trans)
Associates entity with a GL transformation (rotation + translation)
Profile extrusion (primitive)
Definition: ecvExtru.h:17
void setTranslation(const Vector3Tpl< float > &Tr)
Sets translation (float version)
T * getColumn(unsigned index)
Returns a pointer to a given column.
Float version of ccGLMatrixTpl.
Definition: ecvGLMatrix.h:19
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
void applyGLTransformation_recursive(const ccGLMatrix *trans=nullptr)
Applies the active OpenGL transformation to the entity (recursive)
Triangular mesh.
Definition: ecvMesh.h:35
Torus (primitive)
Definition: ecvTorus.h:16
@ PDMS_SCYLINDER
Definition: PdmsTools.h:69
@ PDMS_PYRAMID
Definition: PdmsTools.h:74
@ PDMS_CONE
Definition: PdmsTools.h:73
@ PDMS_CTORUS
Definition: PdmsTools.h:70
@ PDMS_EXTRU
Definition: PdmsTools.h:78
@ PDMS_BOX
Definition: PdmsTools.h:76
@ PDMS_DISH
Definition: PdmsTools.h:72
@ PDMS_VERTEX
Definition: PdmsTools.h:81
@ PDMS_LOOP
Definition: PdmsTools.h:80
@ PDMS_RTORUS
Definition: PdmsTools.h:71
@ PDMS_SNOUT
Definition: PdmsTools.h:75
@ PDMS_NBOX
Definition: PdmsTools.h:77
@ PDMS_NEXTRU
Definition: PdmsTools.h:79
Generic file read and write utility for python interface.
Generic loading parameters.
Definition: FileIOFilter.h:51