ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
PdmsParser.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 "PdmsParser.h"
9 
10 // system
11 #include <assert.h>
12 #include <stdio.h>
13 
14 #include <cstdlib>
15 #include <iostream>
16 
18 inline void upperStr(char* s) {
19  while (*s) {
20  if (((*s) >= 'a') && ((*s) <= 'z')) (*s) += 'A' - 'a';
21  s++;
22  }
23 }
24 
26 // PDMS LEXER
28 
30  : loadedObject(nullptr),
31  currentToken(PDMS_INVALID_TOKEN),
32  stop(false),
33  metaGroupMask(0) {
34  tokenBuffer[0] = 0;
35  nextBuffer[0] = 0;
36 }
37 
39  loadedObject = nullptr;
41  stop = false;
42  memset(tokenBuffer, 0, c_max_buff_size);
43  memset(nextBuffer, 0, c_max_buff_size);
44  metaGroupMask = 0;
45 
46  dictionary.clear();
48  pushIntoDictionary("AND", PDMS_AND, 3);
49  pushIntoDictionary("IS", PDMS_IS, 2);
50  pushIntoDictionary("WRT", PDMS_WRT, 3);
51  pushIntoDictionary("LAST", PDMS_LAST, 4);
52  pushIntoDictionary("GROUP", PDMS_GROUP, 2);
53  pushIntoDictionary("WORLD", PDMS_WORLD, 4);
54  pushIntoDictionary("SITE", PDMS_SITE, 3);
55  pushIntoDictionary("ZONE", PDMS_ZONE, 3);
56  pushIntoDictionary("EQUIPMENT", PDMS_EQUIPMENT, 3);
57  pushIntoDictionary("STRUCTURE", PDMS_STRUCTURE, 3);
58  pushIntoDictionary("SUBSTRUCTURE", PDMS_SUBSTRUCTURE, 4);
59  pushIntoDictionary("END", PDMS_END, 3);
60  pushIntoDictionary("NAME", PDMS_NAME, 4);
61  pushIntoDictionary("SLCYLINDER", PDMS_SCYLINDER, 3);
62  pushIntoDictionary("CYLINDER", PDMS_SCYLINDER, 3);
63  pushIntoDictionary("CTORUS", PDMS_CTORUS, 4);
64  pushIntoDictionary("RTORUS", PDMS_RTORUS, 4);
65  pushIntoDictionary("DISH", PDMS_DISH, 3);
66  pushIntoDictionary("CONE", PDMS_CONE, 3);
67  pushIntoDictionary("BOX", PDMS_BOX, 3);
68  pushIntoDictionary("NBOX", PDMS_NBOX, 4);
69  pushIntoDictionary("PYRAMID", PDMS_PYRAMID, 4);
70  pushIntoDictionary("SNOUT", PDMS_SNOUT, 4);
71  pushIntoDictionary("EXTRUSION", PDMS_EXTRU, 5);
72  pushIntoDictionary("NXTRUSION", PDMS_NEXTRU, 5);
73  pushIntoDictionary("LOOP", PDMS_LOOP, 4);
74  pushIntoDictionary("VERTEX", PDMS_VERTEX, 4);
75  pushIntoDictionary("EST", PDMS_EST, 1);
76  pushIntoDictionary("NORTH", PDMS_NORTH, 1);
77  pushIntoDictionary("UP", PDMS_UP, 1);
78  pushIntoDictionary("WEST", PDMS_WEST, 1);
79  pushIntoDictionary("SOUTH", PDMS_SOUTH, 1);
80  pushIntoDictionary("DOWN", PDMS_DOWN, 1);
81  pushIntoDictionary("X", PDMS_X, 1);
82  pushIntoDictionary("Y", PDMS_Y, 1);
83  pushIntoDictionary("Z", PDMS_Z, 1);
84  pushIntoDictionary("DIAMETER", PDMS_DIAMETER, 3);
85  pushIntoDictionary("RADIUS", PDMS_RADIUS, 3);
86  pushIntoDictionary("HEIGHT", PDMS_HEIGHT, 3);
87  pushIntoDictionary("XTSHEAR", PDMS_X_TOP_SHEAR, 4);
89  pushIntoDictionary("YTSHEAR", PDMS_Y_TOP_SHEAR, 4);
91  pushIntoDictionary("XBOTTOM", PDMS_X_BOTTOM, 4);
92  pushIntoDictionary("YBOTTOM", PDMS_Y_BOTTOM, 4);
93  pushIntoDictionary("XTOP", PDMS_X_TOP, 4);
94  pushIntoDictionary("YTOP", PDMS_Y_TOP, 4);
95  pushIntoDictionary("XOFF", PDMS_X_OFF, 4);
96  pushIntoDictionary("YOFF", PDMS_Y_OFF, 4);
99  pushIntoDictionary("XLENGTH", PDMS_XLENGTH, 4);
100  pushIntoDictionary("YLENGTH", PDMS_YLENGTH, 4);
101  pushIntoDictionary("ZLENGTH", PDMS_ZLENGTH, 4);
102  pushIntoDictionary("ANGLE", PDMS_ANGLE, 4);
106  pushIntoDictionary("POSITION", PDMS_POSITION, 3);
107  pushIntoDictionary("ORIENTED", PDMS_ORIENTATION, 3);
108  pushIntoDictionary("METRE", PDMS_METRE, 1);
109  pushIntoDictionary("MILLIMETRE", PDMS_MILLIMETRE, 3);
111  pushIntoDictionary("OWNER", PDMS_OWNER, 3);
112  pushIntoDictionary("RETURN", PDMS_RETURN, 6);
113 
114  return true;
115 }
116 
117 void PdmsLexer::closeSession(bool destroyLoadedObject) {
118  dictionary.clear();
119  if (destroyLoadedObject && loadedObject) {
120  PdmsObjects::Stack::Destroy(loadedObject);
121  }
122 }
123 
125  const int enter_meta_group_mask = 1;
126  const int leave_meta_group_mask = 100;
127 
128  // Special case: in meta group, the lexer splits Meta Group comments into
129  // appropriated tokens
130  if (metaGroupMask) {
131  metaGroupMask++;
132  switch (metaGroupMask) {
133  case enter_meta_group_mask + 1:
135  return true;
136  case enter_meta_group_mask + 2:
138  return true;
139  case enter_meta_group_mask + 3:
141  return true;
142  case leave_meta_group_mask + 1:
144  return true;
145  case leave_meta_group_mask + 2:
147  return true;
148  default:
149  metaGroupMask = 0;
150  break;
151  }
152  }
153 
154  // Usual cases
156  if (stop) {
157  return false;
158  }
159  while (currentToken == PDMS_INVALID_TOKEN) {
160  if (!moveForward())
162  else {
164  switch (currentToken) {
165  case PDMS_COMMENT_LINE:
166  case PDMS_COMMENT_BLOCK:
167  skipComment();
169  metaGroupMask = enter_meta_group_mask;
170  break;
171  }
173  metaGroupMask = leave_meta_group_mask;
174  break;
175  }
176  case PDMS_UNUSED:
178  break;
179  default:
180  break;
181  }
182  }
183  }
184 
185  if (metaGroupMask) return gotoNextToken();
186 
187  return (currentToken != PDMS_EOS);
188 }
189 
192  if (tokenBuffer[0] == '/')
194  else if (strncmp(tokenBuffer, "$*", 2) == 0)
196  else if (strncmp(tokenBuffer, "$(", 2) == 0)
198  else if (tokenBuffer[0] == '-' ||
199  ('0' <= tokenBuffer[0] && tokenBuffer[0] <= '9'))
201  else if (strcmp(tokenBuffer, "ENDHANDLE") == 0)
203  else if (strncmp(tokenBuffer, "HANDLE", 6) == 0) {
206  } else {
207  std::map<std::string, Token>::const_iterator location;
208  location = dictionary.find(std::string(tokenBuffer));
209  if (location != dictionary.end()) currentToken = location->second;
210  }
211 }
212 
214  size_t index = strlen(tokenBuffer);
215  size_t length = 0;
216  while (index > 0) // go back until we meet a number symbol
217  {
218  if ((tokenBuffer[index - 1] >= '0' && tokenBuffer[index - 1] <= '9') ||
219  tokenBuffer[index - 1] == '.')
220  break;
221  index--;
222  length++;
223  }
224 
225  // Read units
226  if (length > 0) {
227  strcpy(nextBuffer, tokenBuffer + index);
228  memset(tokenBuffer + index, 0, length);
229  }
230 
231  // Replace comma
232  length = strlen(tokenBuffer);
233  for (index = 0; index < length; index++)
234  if (tokenBuffer[index] == ',') tokenBuffer[index] = '.';
235 
236  // convert value
237  PointCoordinateType value =
238  static_cast<PointCoordinateType>(atof(tokenBuffer));
239 
240  return value;
241 }
242 
243 const char* PdmsLexer::nameFromBuffer() const { return &tokenBuffer[1]; }
244 
246  if (strlen(nextBuffer)) {
247  strcpy(tokenBuffer, nextBuffer);
248  memset(nextBuffer, 0, c_max_str_length);
249  return true;
250  }
251  return false;
252 }
253 
254 void PdmsLexer::pushIntoDictionary(const char* str, Token token, int minSize) {
255  int n = static_cast<int>(strlen(str));
256  if (minSize == 0 || minSize > n) minSize = n;
257  for (; minSize <= n; minSize++)
258  dictionary[std::string(str).substr(0, minSize)] = token;
259 }
260 
262  : m_filename(filename),
263  m_currentLine(-1),
264  m_eol(false),
265  m_eof(false),
266  m_file(nullptr) {}
267 
270  m_file = fopen(m_filename.c_str(), "r");
271  if (!m_file) return false;
272 
273  m_currentLine = 1;
274  m_eol = false;
275  m_eof = false;
276 
277  return true;
278 }
279 
280 void PdmsFileSession::closeSession(bool destroyLoadedObject) {
281  if (m_file) {
282  fclose(m_file);
283  m_file = nullptr;
284  }
285 
286  PdmsLexer::closeSession(destroyLoadedObject);
287 }
288 
290  if (m_eof && strlen(tokenBuffer) == 0)
292  else
294 }
295 
297  if (PdmsLexer::moveForward()) return true;
298 
299  m_eol = false;
300  bool tokenFilled = false;
301  unsigned n = 0;
302  while (!tokenFilled) {
303  int car = getc(m_file);
304  switch (car) {
305  case '\n':
306  if (n > 0) {
307  tokenFilled = true;
308  m_eol = true;
309  }
310  m_currentLine++;
311  break;
312  case ' ':
313  case '\t':
314  if (n > 0) tokenFilled = true;
315  break;
316  case EOF:
317  tokenFilled = true;
318  m_eof = true;
319  break;
320  default:
321  if (n >= c_max_buff_size) {
322  printWarning("Buffer overflow");
323  return false;
324  }
325  tokenBuffer[n] = car;
326  n++;
327  break;
328  }
329  }
330  tokenBuffer[n] = '\0';
331  if (tokenBuffer[0] != '/') upperStr(tokenBuffer);
332  return (n > 0);
333 }
334 
336  switch (currentToken) {
337  case PDMS_COMMENT_LINE:
338  // skip line only if the end of line has not been read in current
339  // buffer
340  if (!m_eol) {
341  int n = 0;
342  int car = 0;
343  do {
344  car = getc(m_file);
345  if (car == '\t') car = ' ';
346  tokenBuffer[n] = car;
347  if (((n + 1) < c_max_buff_size) &&
348  ((car != ' ') || (n > 0 && tokenBuffer[n - 1] != ' ')))
349  n++;
350  } while (car != EOF && car != '\n');
351  if (car == '\n') m_currentLine++;
352  tokenBuffer[n - 1] = '\0';
353  }
354  m_eol = false;
355  break;
356  case PDMS_COMMENT_BLOCK: {
357  // comment block opening symbol has been met. Search for comment
358  // block ending symbol don't forget that some other comments could
359  // be embedded in this comment
360  bool commentSymb = false;
361  int commentBlockLevel = 1;
362  int n = 0;
363  int car = 0;
364  do {
365  car = getc(m_file);
366  if (car == '\n') m_currentLine++;
367  if (car == '\n' || car == '\t') car = ' ';
368  if (car == '$')
369  commentSymb = true;
370  else if (car == '(' && commentSymb)
371  commentBlockLevel++;
372  else if (car == ')' && commentSymb)
373  commentBlockLevel--;
374  else {
375  commentSymb = false;
376  tokenBuffer[n] = car;
377  if (((n + 1) < c_max_buff_size) &&
378  ((car != ' ') || (n > 0 && tokenBuffer[n - 1] != ' ')))
379  n++;
380  }
381  } while (car != EOF && commentBlockLevel > 0);
382  tokenBuffer[n - 1] = '\0';
383  m_eol = false;
384  } break;
385  default:
386  break;
387  }
388 
390  if (strncmp(tokenBuffer, "ENTERING IN GROUP:", 18) == 0) {
392  // The meta group name starts after the "entering in group:" statement,
393  // after the last slash But we still store the whole path
394  char* ptr2 = tokenBuffer + 18;
395  while ((*ptr2) == ' ') {
396  ptr2++;
397  }
398  // Copy the meta group name at the beginning of tokenbuffer
399  tokenBuffer[0] = '/';
400  char* ptr1 = tokenBuffer + 1;
401  while ((*ptr2) && (*ptr2) != ' ') {
402  *ptr1 = *ptr2;
403  ptr1++;
404  ptr2++;
405  }
406  *ptr1 = '\0';
407  metaGroupMask = 0;
408  } else if (strncmp(tokenBuffer, "LEAVING GROUP", 13) == 0) {
410  metaGroupMask = 0;
411  }
412 }
413 
415  int opened = 0, state = 0;
416 
417  // Search for "HANDLE(...)" and remove this string from tokenBuffer
418  for (unsigned i = 0; i < strlen(tokenBuffer); i++) {
419  if (tokenBuffer[i] == '(') {
420  opened++;
421  state++;
422  } else if (tokenBuffer[i] == ')')
423  state--;
424  if (opened > 0 && state == 0) return;
425  }
426  //"HANDLE(...) does not lie in tokenBuffer, then search it in the file
427  while (!(opened > 0 && state == 0)) {
428  int car = getc(m_file);
429  if (car == '(') {
430  opened++;
431  state++;
432  } else if (car == ')')
433  state--;
434  }
435  memset(tokenBuffer, 0, c_max_str_length);
436 }
437 
438 void PdmsFileSession::printWarning(const char* str) {
439  if (currentToken == PDMS_EOS)
440  std::cerr << "[" << m_filename << "]@postprocessing : " << str
441  << std::endl;
442  else
443  std::cerr << "[" << m_filename << "]@[line " << m_currentLine << "]::["
444  << tokenBuffer << "] : " << str << std::endl;
445 }
446 
448 // PDMS PARSER
451  : session(nullptr),
452  currentCommand(nullptr),
453  currentItem(nullptr),
454  root(nullptr) {}
455 
457  if (currentCommand) {
458  delete currentCommand;
459  currentCommand = nullptr;
460  }
461 
462  if (currentItem) {
464  PdmsObjects::Stack::Destroy(currentItem);
465  }
466 
467  PdmsObjects::Stack::Clear();
468 }
469 
471  session = s;
472  currentCommand = nullptr;
473  currentItem = nullptr;
474  root = nullptr;
475  PdmsCommands::DistanceValue::setWorkingUnit(PDMS_MILLIMETRE);
476 }
477 
479  if (!session) {
480  assert(false);
481  return false;
482  }
483 
484  Token currentToken = session->getCurrentToken();
485  switch (currentToken) {
486  case PDMS_UNUSED:
487  break;
488 
489  case PDMS_UNKNOWN:
490  session->printWarning("Unknown token");
491  return false;
492 
493  case PDMS_EOS:
494  break;
495 
496  case PDMS_NUM_VALUE:
497  // There should be a active command, and it should handle the value
498  if (!currentCommand ||
500  session->printWarning("Unexpected numerical value");
501  return false;
502  }
503  break;
504 
505  case PDMS_NAME_STR:
506  // There should be a active command, and it should handle the char
507  // string
508  if (!currentCommand ||
511  "Last token cannot be associated with a name");
512  return false;
513  }
514  break;
515 
516  default:
517  // If there is an active command
518  if (currentCommand) {
519  // If the active command can handle the new token, it's ok
520  if (currentCommand->handle(currentToken)) return true;
521 
522  // Else, the token must be a new command. We execute the active
523  // command and delete it
525  bool success = currentCommand->execute(item);
526  delete currentCommand;
527  currentCommand = nullptr;
528  if (!success) {
529  assert(false);
531  "Unable to resolve previous command (this token "
532  "may be unexpected in current command)");
533  return false;
534  }
535  // The command execution could have changed the current item
536  if (item) {
537  currentItem = item;
538  } else if (currentItem) {
539  if (!root) {
540  root = currentItem->getRoot();
541  currentItem = nullptr;
542  } else {
543  assert(false);
545  "Trying to create a second root for elements "
546  "hierarchy");
547  return false;
548  }
549  }
550  }
551  if (currentToken == PDMS_RETURN) {
552  session->finish();
553  } else {
554  // Here, we must create a new command from the token speciffied
555  // by the lexer
556  currentCommand = PdmsCommands::Command::Create(currentToken);
557  if (!currentCommand) {
558  session->printWarning("Unknown command");
559  assert(false);
560  return false;
561  }
562  }
563  break;
564  }
565  return true;
566 }
567 
569  PdmsObjects::Stack::Init();
570 
571  if (!session || !session->initializeSession()) {
572  return false;
573  }
574 
575  while (session->gotoNextToken()) {
576  if (!processCurrentToken()) {
577  session->closeSession(true);
578  return false;
579  }
580  }
581  // If the hierarchy root has not yet been computed, do it now.
582  if (!root) root = currentItem->getRoot();
583  // else check that the current item doesn't belong to a new root
584  else if (currentItem->getRoot() != root)
586  "there could be several hierarchy root specified in this file");
589  session->closeSession(false);
590  return true;
591 }
592 
594  PdmsObjects::GenericItem* result = nullptr;
596  if (forgetIt) {
597  currentItem = nullptr;
598  root = nullptr;
599  }
600  return result;
601 }
float PointCoordinateType
Type of the coordinates of a (N-D) point.
Definition: CVTypes.h:16
std::string filename
void upperStr(char *s)
Definition: PdmsParser.cpp:18
core::Tensor result
Definition: VtkUtils.cpp:76
virtual void skipHandleCommand() override
Definition: PdmsParser.cpp:414
virtual bool initializeSession() override
Definition: PdmsParser.cpp:268
virtual void parseCurrentToken() override
Definition: PdmsParser.cpp:289
virtual void skipComment() override
Definition: PdmsParser.cpp:335
virtual void printWarning(const char *str) override
Definition: PdmsParser.cpp:438
virtual bool moveForward() override
Definition: PdmsParser.cpp:296
virtual void closeSession(bool destroyLoadedObject=false) override
Definition: PdmsParser.cpp:280
std::string m_filename
Definition: PdmsParser.h:65
PdmsFileSession(const std::string &filename)
Definition: PdmsParser.cpp:261
PDMS Lexer.
Definition: PdmsParser.h:22
virtual bool moveForward()
Definition: PdmsParser.cpp:245
virtual void parseCurrentToken()
Definition: PdmsParser.cpp:190
PdmsObjects::GenericItem * getLoadedObject() const
Definition: PdmsParser.h:38
bool stop
Definition: PdmsParser.h:52
virtual void closeSession(bool destroyLoadedObject=false)
Definition: PdmsParser.cpp:117
char tokenBuffer[c_max_buff_size]
Definition: PdmsParser.h:49
static const int c_max_buff_size
Definition: PdmsParser.h:45
PointCoordinateType valueFromBuffer()
Definition: PdmsParser.cpp:213
std::map< std::string, Token > dictionary
Definition: PdmsParser.h:51
char metaGroupMask
Definition: PdmsParser.h:53
const char * nameFromBuffer() const
Definition: PdmsParser.cpp:243
virtual bool initializeSession()
Definition: PdmsParser.cpp:38
virtual void skipHandleCommand()=0
char nextBuffer[c_max_buff_size]
Definition: PdmsParser.h:50
bool gotoNextToken()
Definition: PdmsParser.cpp:124
virtual void printWarning(const char *str)=0
void finish()
Definition: PdmsParser.h:29
PdmsObjects::GenericItem * loadedObject
Definition: PdmsParser.h:47
void setLoadedObject(PdmsObjects::GenericItem *o)
Definition: PdmsParser.h:40
Token getCurrentToken() const
Definition: PdmsParser.h:37
void pushIntoDictionary(const char *str, Token token, int minSize=0)
Definition: PdmsParser.cpp:254
virtual void skipComment()=0
Token currentToken
Definition: PdmsParser.h:48
bool parseSessionContent()
Definition: PdmsParser.cpp:568
bool processCurrentToken()
Definition: PdmsParser.cpp:478
void linkWithSession(PdmsLexer *s)
Definition: PdmsParser.cpp:470
PdmsLexer * session
Definition: PdmsParser.h:107
PdmsObjects::GenericItem * getLoadedObject(bool forgetIt=true)
Definition: PdmsParser.cpp:593
PdmsParser()
Default constructor.
Definition: PdmsParser.cpp:450
PdmsObjects::GenericItem * currentItem
Definition: PdmsParser.h:109
PdmsCommands::Command * currentCommand
Definition: PdmsParser.h:108
PdmsObjects::GenericItem * root
Definition: PdmsParser.h:110
virtual bool execute(PdmsObjects::GenericItem *&item) const
Definition: PdmsTools.h:491
virtual bool handle(PointCoordinateType numvalue)
Definition: PdmsTools.h:487
virtual GenericItem * getRoot()
Definition: PdmsTools.h:172
__host__ __device__ float length(float2 v)
Definition: cutil_math.h:1162
const int c_max_str_length
Definition: PdmsTools.h:22
@ PDMS_NAME
Definition: PdmsTools.h:40
@ PDMS_X_BOTTOM_SHEAR
Definition: PdmsTools.h:86
@ PDMS_Y_TOP
Definition: PdmsTools.h:92
@ PDMS_Y_TOP_SHEAR
Definition: PdmsTools.h:87
@ PDMS_NUM_VALUE
Definition: PdmsTools.h:38
@ PDMS_RADIUS
Definition: PdmsTools.h:99
@ PDMS_SOUTH
Definition: PdmsTools.h:54
@ PDMS_WEST
Definition: PdmsTools.h:53
@ PDMS_SCYLINDER
Definition: PdmsTools.h:69
@ PDMS_X_BOTTOM
Definition: PdmsTools.h:89
@ PDMS_DOWN
Definition: PdmsTools.h:55
@ PDMS_ZLENGTH
Definition: PdmsTools.h:97
@ PDMS_UNUSED
Definition: PdmsTools.h:31
@ PDMS_RETURN
Definition: PdmsTools.h:45
@ PDMS_NORTH
Definition: PdmsTools.h:51
@ PDMS_Y_BOTTOM
Definition: PdmsTools.h:90
@ PDMS_SUBSTRUCTURE
Definition: PdmsTools.h:67
@ PDMS_OWNER
Definition: PdmsTools.h:41
@ PDMS_PYRAMID
Definition: PdmsTools.h:74
@ PDMS_HEIGHT
Definition: PdmsTools.h:84
@ PDMS_NAME_STR
Definition: PdmsTools.h:34
@ PDMS_COMMENT_LINE
Definition: PdmsTools.h:32
@ PDMS_ENTER_METAGROUP
Definition: PdmsTools.h:47
@ PDMS_ORIENTATION
Definition: PdmsTools.h:106
@ PDMS_TOP_DIAMETER
Definition: PdmsTools.h:102
@ PDMS_END
Definition: PdmsTools.h:44
@ PDMS_STRUCTURE
Definition: PdmsTools.h:66
@ PDMS_METRE
Definition: PdmsTools.h:108
@ PDMS_OUTSIDE_RADIUS
Definition: PdmsTools.h:101
@ PDMS_WORLD
Definition: PdmsTools.h:62
@ PDMS_Y_BOTTOM_SHEAR
Definition: PdmsTools.h:88
@ PDMS_CONE
Definition: PdmsTools.h:73
@ PDMS_BOTTOM_DIAMETER
Definition: PdmsTools.h:103
@ PDMS_X_OFF
Definition: PdmsTools.h:93
@ PDMS_LAST
Definition: PdmsTools.h:46
@ PDMS_SITE
Definition: PdmsTools.h:63
@ PDMS_INVALID_TOKEN
Definition: PdmsTools.h:28
@ PDMS_CTORUS
Definition: PdmsTools.h:70
@ PDMS_EXTRU
Definition: PdmsTools.h:78
@ PDMS_AND
Definition: PdmsTools.h:37
@ PDMS_WRT
Definition: PdmsTools.h:42
@ PDMS_EST
Definition: PdmsTools.h:50
@ PDMS_CREATE
Definition: PdmsTools.h:43
@ PDMS_BOX
Definition: PdmsTools.h:76
@ PDMS_COMMENT_BLOCK
Definition: PdmsTools.h:33
@ PDMS_MILLIMETRE
Definition: PdmsTools.h:109
@ PDMS_DISH
Definition: PdmsTools.h:72
@ PDMS_VERTEX
Definition: PdmsTools.h:81
@ PDMS_POSITION
Definition: PdmsTools.h:105
@ PDMS_LOOP
Definition: PdmsTools.h:80
@ PDMS_EOS
Definition: PdmsTools.h:30
@ PDMS_X_TOP_SHEAR
Definition: PdmsTools.h:85
@ PDMS_DIAMETER
Definition: PdmsTools.h:83
@ PDMS_RTORUS
Definition: PdmsTools.h:71
@ PDMS_EQUIPMENT
Definition: PdmsTools.h:65
@ PDMS_SNOUT
Definition: PdmsTools.h:75
@ PDMS_GROUP
Definition: PdmsTools.h:60
@ PDMS_X_TOP
Definition: PdmsTools.h:91
@ PDMS_INSIDE_RADIUS
Definition: PdmsTools.h:100
@ PDMS_NBOX
Definition: PdmsTools.h:77
@ PDMS_LEAVE_METAGROUP
Definition: PdmsTools.h:48
@ PDMS_Y_OFF
Definition: PdmsTools.h:94
@ PDMS_NEXTRU
Definition: PdmsTools.h:79
@ PDMS_ZONE
Definition: PdmsTools.h:64
@ PDMS_YLENGTH
Definition: PdmsTools.h:96
@ PDMS_XLENGTH
Definition: PdmsTools.h:95
@ PDMS_ANGLE
Definition: PdmsTools.h:98
@ PDMS_UNKNOWN
Definition: PdmsTools.h:29
QTextStream & endl(QTextStream &stream)
Definition: QtCompat.h:718