VR-Forces 5.0.1 Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
vrfXmlUtils.h
Go to the documentation of this file.
1 /*********************************************************************
2 ** Copyright (c) 2013 MaK Technologies, Inc.
3 ** All rights reserved.
4 *********************************************************************/
5 
6 #pragma once
7 
10 #include "mtl/environment.h"
11 #include "mtl/envXmlWriter.h"
18 #include "extMtl/extDtcRead.h"
26 #include "vrfutil/formationTable.h"
28 #include "vrfutil/soilList.h"
29 #include "vrfutil/soilFactors.h"
30 
31 #include "vlutil/vlStringUtil.h"
32 #include "vlutil/vlFilename.h"
33 
34 #include <boost/function.hpp>
35 #include <boost/lexical_cast.hpp>
36 
37 #include <iostream>
40 
42 {
43 public:
44  typedef std::list<DtEnvValueSP> DtEnvValueSPList;
45 
49 
52  static void getObjectElements(DtEnvironmentSP env, DtEnvValueSPList& objectNodes);
53 
54  static DtEnvValueSP addObjectElement(DtEnvironmentSP env, DtObjectType objType, DtObjectType matchType,
55  DtString platform, DtString parentFile = "");
56 
58  static DtEnvValueSP findObjectElementByMatchType(DtEnvironmentSP env, const DtObjectType& objType);
59  static DtEnvValueSP findObjectElementByObjectType(DtEnvironmentSP env, const DtObjectType& objType);
60 
64  static DtString getAttribute(DtEnvironmentSP env, const DtString& name,
65  DtEnvValueSP root);
66 
68  static bool hasAttribute(DtEnvironmentSP env, const DtString& name,
69  DtEnvValueSP root);
70 
71  static bool FindAndRemove(DtEnvironmentSP env, const DtString& nodeType, const DtString& paramName, DtEnvValueSP root);
72 
74  static void remove(DtEnvironmentSP, DtEnvValueSP);
75 
76 
77  //get a specific element in the hierarchy based on its first param name, e.g. "articulated-parts". Argument is a pointer to the simObject tag
78  static DtEnvValueSP getTagByAttribute(DtEnvironmentSP env, DtEnvValueSP simObjectNode, DtString attr);
79 
80  //get a specific system element in the hierarchy based on its systemName, e.g. "other-10". Argument is a pointer to the simObject tag
81  static DtEnvValueSP getSystemByAttribute(DtEnvironmentSP env, DtEnvValueSP simObjectNode, DtString sysName);
82 
84  static DtString getPlatform(DtEnvironmentSP env, DtEnvValueSP root)
85  {
87  }
88 
90  static DtString getParentFile(DtEnvironmentSP env, DtEnvValueSP root)
91  {
93  }
94 
95  static DtString GetObjectValue(DtEnvValueSP root)
96  {
97  return XmlBindingCharToMtl(root->value());
98  }
99 
100  static DtEnvValueSP AddElement(DtEnvironmentSP env, const DtString& type,
101  DtEnvValueSP root, const DtString& paramName = DtString::nullString())
102  {
103  FindAndRemove(env, type, paramName, root);
104  DtEnvValueSP newElement = env->addObject(type, type, root);
105  if (paramName != DtString::nullString())
106  {
107  env->addAttribute(vrfXml::ParamName, paramName, newElement);
108  }
109  return newElement;
110  }
111 
113  static DtEnvValueSP addbooleanElement(DtEnvironmentSP env, DtEnvValueSP root, const DtString& name, bool value)
114  {
115  DtEnvValueSP newElement = AddElement(env, DtXMLBooleanType, root, name);
116  newElement->setValue(value ? "True" : "False");
117  return newElement;
118  }
119 
121  static DtEnvValueSP addRealElement(DtEnvironmentSP env, DtEnvValueSP root, const DtString& name, double value)
122  {
123  DtEnvValueSP newElement = AddElement(env, DtXMLRealType, root, name);
124  newElement->setValue(DtString(value));
125  return newElement;
126  }
127 
129  static DtEnvValueSP addIntegerElement(DtEnvironmentSP env, DtEnvValueSP root, const DtString& name, double value)
130  {
131  DtEnvValueSP newElement = AddElement(env, DtXMLIntType, root, name);
132  newElement->setValue(DtString(value));
133  return newElement;
134  }
135 
136  static DtEnvValueSP addBooleanAttribute(DtEnvironmentSP env, DtEnvValueSP root, const DtString& name, bool value)
137  {
138  return env->addAttribute(name, value ? "True" : "False", root);
139  }
140 
142 
144  static DtEnvValueSP addStringElement(DtEnvironmentSP env, DtEnvValueSP root, const DtString& name, const DtString& value)
145  {
146  DtEnvValueSP newElement = AddElement(env, DtXMLStringType, root, name);
147  newElement->setValue(MtlBindingCharToXml(value));
148  return newElement;
149  }
150 
151  static DtEnvValueSP addStringAttribute(DtEnvironmentSP env, DtEnvValueSP root, const DtString& name, const DtString& value)
152  {
153  DtEnvValueSP attr = env->getAttribute(name, root);
154  if (attr.get())
155  {
156  attr->setValue(DtMtlBindingCharToXml(value));
157  return attr;
158  }
159 
160  return attr = env->addAttribute(name, DtMtlBindingCharToXml(value), root);
161  }
162 
163  static void setObjectType(DtEnvironmentSP env, DtEnvValueSP root, const DtObjectType& t)
164  {
165  addStringAttribute(env, root, DtXMLObjectTypeType, t.string());
166  }
167 
168  static void setMatchType(DtEnvironmentSP env, DtEnvValueSP root, const DtObjectType& t)
169  {
170  addStringAttribute(env, root, vrfXml::MatchType, t.string());
171  }
172 
173  static std::list<DtObjectType> additionalMatchTypes(DtEnvironmentSP env, DtEnvValueSP root);
174  static void setAdditionalMatchTypes(DtEnvironmentSP env, DtEnvValueSP root, const std::list<DtObjectType>& types);
175 
176  static void setPlatform(DtEnvironmentSP env, DtEnvValueSP root, const DtString& t)
177  {
178  addStringAttribute(env, root, vrfXml::Platform, t);
179  }
180 
181  static double getDoubleAttribute(DtEnvironmentSP env, DtString attributeName, DtEnvValueSP root)
182  {
183  return DtRwReal::getDouble(env, attributeName, root);
184  }
185 
188  static void ExtractBindings(DtVariableBindingsList& list,
189  const DtReaderWriter::SearchPaths& searchPaths, DtEnvironmentSP env, DtEnvValueSP node);
190 
192  static DtReaderWriter* CreateRwObject(const DtString& rwType)
193  {
194  return DtReaderWriter::factory()->createItem(rwType, DtString::nullString(), NULL);
195  }
196 
197  static void getOrientation(DtEnvironmentSP env,
198  const DtEnvValueSP parentNode, DtTaitBryan& orientation)
199  {
200  orientation.setPsi(getDoubleAttribute(env, DtXMLYaw, parentNode));
201  orientation.setTheta(getDoubleAttribute(env, DtXMLPitch, parentNode));
202  orientation.setPhi(getDoubleAttribute(env, DtXMLRoll, parentNode));
203  }
204 
205 
208  static void CreateVariableBinding(const DtString& bindingType,
209  const DtReaderWriter::SearchPaths& searchPaths, const DtVariableBindingsList& systemBindings,
210  DtRwVariableBindings& newBindings,
211  DtEnvironmentSP env, DtEnvValueSP binding);
212 
214  static void AddSystems(DtComponentSystemDescriptorList& list,
215  const DtVariableBindingsList& variableBindings, DtEnvironmentSP env,
216  DtEnvValueSP* root, const DtReaderWriter::SearchPaths& searchPaths);
217 
219  static void AddSystem(DtComponentSystemDescriptorList& list,
220  DtEnvironmentSP env, const DtVariableBindingsList& variableBindings,
221  DtEnvValueSP root, const DtReaderWriter::SearchPaths& searchPaths,
222  DtEnvironmentSP parentEnt = DtEnvironmentSP(), DtString systemName = "");
223 
224  static DtEnvironmentSP CreateVrfXmlEnvironment();
225 
227  static DtEnvironmentSP CreateDtXMLEnvironment(
228  const DtString& dataSourceFilename, bool showConsoleOutput = true);
229 
230  static DtEnvValueSP GetElementByType(DtEnvironmentSP env,
231  const DtString& type, DtEnvValueSP root);
232 
233  static DtEnvValueSPList GetElementsByType(DtEnvironmentSP env, const DtString& type,
234  DtEnvValueSP root);
235 
239 
241  {
242  return DtXmlBindingCharToMtl(str);
243  }
244 
246  {
247  return DtMtlBindingCharToXml(str);
248  }
249 
251 
253  static std::set<DtString> getVariableTypesFromEnvironment(DtEnvValueSP);
254 
255 
256  static DtEnvValueSP FindElementByParamName(DtEnvironmentSP env,
257  const DtString& nodeType, const DtString& attributeValue,
258  DtEnvValueSP envValue, bool traverseElements = true)
259  {
260  return FindElementByAttrValue(env, nodeType, DtXMLParamName,
261  attributeValue, envValue, traverseElements);
262  }
263 
264  static DtEnvValueSP FindElementBySystemName(DtEnvironmentSP env,
265  const DtString& nodeType, const DtString& attributeValue,
266  DtEnvValueSP envValue, bool traverseElements = true)
267  {
268  return FindElementByAttrValue(env, nodeType, vrfXml::SystemName,
269  attributeValue, envValue, traverseElements);
270 
271  }
272 
273  static DtEnvValueSP FindElementByAttrValue(DtEnvironmentSP env,
274  const DtString& nodeType, const DtString& attributeName,
275  const DtString& attributeValue, DtEnvValueSP envValue,
276  bool traverseElements = true);
277 
278  typedef std::list<DtString> StringVector;
279  typedef std::vector<DtReaderWriterRegistryData*> RegDataVector;
280 
281  typedef std::map<DtString, DtString> GroupMappings;
282 
283  static DtReaderWriterRegistryData* DeepFindRw(const DtString& keyword,
284  DtReaderWriterRegistry& registry, StringVector& path);
285 
286  static bool IsGroupedElement(const DtString& rwName,
287  const DtVrfXmlUtils::GroupMappings& groupedElements, DtString& groupName);
288 
289  static DtEnvValueSP FindGroupElement(DtEnvironmentSP env,
290  DtEnvValueSP parentNode, const DtString& groupName,
291  bool createIfMissing = true);
292 
293  static void FindAndRemoveGroupElement(DtEnvironmentSP env,
294  DtEnvValueSP parentNode, const DtString& groupName);
295 
296  static void IterateOverChildren(DtReaderWriterRegistry& oldRegistry,
297  DtReaderWriterRegistry& newRegistry, DtEnvironmentSP env,
298  DtEnvValueSP root, const GroupMappings& groupedElements, StringVector& path);
299 
302  static DtEnvironmentSP sortEnvironment(DtEnvironmentSP);
303 
304  static DtEnvValueSP CreateEnvNode(DtEnvironmentSP env, const DtString& name,
305  DtEnvValueSP parent, DtString bindingName = "")
306  {
307  //pass in name twice to prevent a "name" attribute from being added
308  DtEnvValueSP newObject = env->addObject(name, name, parent);
309  if (bindingName != "")
310  {
311  env->addAttribute(DtXMLParamName, bindingName, newObject);
312  }
313  return newObject;
314  }
315 
316  static void ExtractVariableBindings(DtRwVariableBindings* variableBindings,
317  DtEnvironmentSP env, DtEnvValueSP parentNode);
318 
319  static void ExtractSystem(DtReaderWriter* systemObject, DtEnvironmentSP env,
320  DtEnvValueSP simObjectNode);
321 
322  static void ExtractSystems(DtReaderWriterRegistry& oldRegistry,
323  DtEnvironmentSP env, DtEnvValueSP simObjectNode);
324 
326  static DtEnvironmentSP CreateVrfXmlEnvironment(
327  const DtString& dataSourceFilename, bool showConsoleOutput = true);
329 
331  static void addParentToXmlEnvironment(DtEnvironmentSP env, const DtString& dataSourceFilename,
332  const DtReaderWriter::SearchPaths, bool showConsoleOutput = true);
334 
335  //called internally to track the state across recursive calls. Use this version to ignore an explicit list of tags
336  static void addParentToXmlEnvironment(DtEnvironmentSP env, const DtString& dataSourceFilename,
337  const DtReaderWriter::SearchPaths, std::vector<DtString>& tagsAlreadySeen, bool showConsoleOutput = true);
338 
340  {
341  DtEnvXMLWriter writer(vrfXml::SimObject);
342 
343  writer.setIndentation(" ");
344  writer.writeFile(*env, filename);
345  }
346 
347  static DtString removeQuotes(const DtString& str)
348  {
349  return DtRemoveQuotes(str);
350  }
351 
353  static DtObjectType getObjectTypeAttr(DtEnvironmentSP env, const DtString& attributeName, DtEnvValueSP root)
354  {
355  DtString objType = getAttribute(env, attributeName, root);
356  DtObjectType ot;
357 
358  ot = objType.c_str();
359 
360  return ot;
361  }
362 
363  static DtObjectType getMatchType(DtEnvironmentSP env, DtEnvValueSP root,
364  bool fallbackOnObjectType = true)
365  {
366  DtObjectType matchType = getObjectTypeAttr(env, vrfXml::MatchType, root);
367  if (matchType == DtObjectType::nullType() && fallbackOnObjectType)
368  {
369  return DtRwObjectType::getObjectType(env, root);
370  }
371 
372  return matchType;
373  }
374 
375  static std::list<DtObjectType> getMatchTypes(DtEnvironmentSP env, DtEnvValueSP root,
376  bool fallbackOnObjectType = true);
377 
378  static DtObjectType getObjectType(DtEnvironmentSP env, DtEnvValueSP root,
379  bool fallbackOnMatchType = true)
380  {
381  DtObjectType objectType = getObjectTypeAttr(env, DtXMLObjectType, root);
382  if (objectType == DtObjectType::nullType() && fallbackOnMatchType)
383  {
384  return getMatchType(env, root, false);
385  }
386 
387  return objectType;
388  }
389 
390  static void getXYZAttrs(DtEnvironmentSP env, const DtEnvValueSP root,
391  double& x, double& y, double& z)
392  {
393  //attributes will either be named "x", "y", "z" or "right", "forward", "up"
394  if (hasAttribute(env, DtXMLBodyForward, root))
395  {
396  x = getDoubleAttribute(env, DtXMLBodyForward, root);
397  y = getDoubleAttribute(env, DtXMLBodyRight, root);
398  z = getDoubleAttribute(env, DtXMLBodyDown, root);
399  }
400  else
401  {
402  x = getDoubleAttribute(env, DtXMLVectorX, root);
403  y = getDoubleAttribute(env, DtXMLVectorY, root);
404  z = getDoubleAttribute(env, DtXMLVectorZ, root);
405  }
406  }
407 
408  typedef std::list<DtString> NameList;
409 
410  static void WriteVector(DtEnvironmentSP env, DtEnvValueSP root,
411  const DtRwVector* vec, bool writeAsBodyPosition)
412  {
413  if (writeAsBodyPosition)
414  {
415  env->addAttribute(DtXMLBodyForward, (*vec)[1], root);
416  env->addAttribute(DtXMLBodyRight, (*vec)[0], root);
417  env->addAttribute(DtXMLBodyDown, (*vec)[2], root);
418  }
419  else
420  {
421  env->addAttribute(DtXMLVectorX, (*vec)[0], root);
422  env->addAttribute(DtXMLVectorY, (*vec)[1], root);
423  env->addAttribute(DtXMLVectorZ, (*vec)[2], root);
424  }
425  }
426 
427  static DtString IntToHexString(const int& number)
428  {
429  char buff[8];
430  sprintf(buff, "%X", number);
431  DtString app("0X");
432  app += buff;
433  return app;
434  }
435 };
static DtObjectType getObjectTypeAttr(DtEnvironmentSP env, const DtString &attributeName, DtEnvValueSP root)
Gets objecttype attribute from current Node.
Definition: vrfXmlUtils.h:353
static DtEnvValueSP CreateEnvNode(DtEnvironmentSP env, const DtString &name, DtEnvValueSP parent, DtString bindingName="")
Definition: vrfXmlUtils.h:304
DT_DLL_readerWriter DtString DtXmlBindingCharToMtl(const DtString &str)
Can&#39;t use &#39;$&#39; for variables. so where we would use it, as in filenames with variables, it will be replaced with &#39;@&#39;.
const char DtXMLVectorZ[]
Definition: rwTypes.h:80
static DtString getParentFile(DtEnvironmentSP env, DtEnvValueSP root)
Gets parent file attribute from current Node.
Definition: vrfXmlUtils.h:90
static void WriteXML(DtEnvironmentSP env, DtString filename)
Definition: vrfXmlUtils.h:339
Definition: vrfXmlUtils.h:41
static const char * Platform
Definition: vrfXmlTypes.h:46
const char DtXMLStringType[]
Definition: rwTypes.h:50
static DtString getPlatform(DtEnvironmentSP env, DtEnvValueSP root)
Gets platform attribute from current Node.
Definition: vrfXmlUtils.h:84
static double getDoubleAttribute(DtEnvironmentSP env, DtString attributeName, DtEnvValueSP root)
Definition: vrfXmlUtils.h:181
Definition: readerWriterRegistryData.h:25
#define DT_DLL_vrfobjparam
This file is used to determine how to build.
Definition: vrfobjparamDefines.h:28
const char DtXMLRoll[]
Definition: vrfRwTypes.h:305
static void getOrientation(DtEnvironmentSP env, const DtEnvValueSP parentNode, DtTaitBryan &orientation)
Definition: vrfXmlUtils.h:197
DT_DLL_readerWriter DtBoost::shared_ptr< DtEnvironment > DtEnvironmentSP
Definition: readerWriter.h:30
const char DtXMLIntType[]
Definition: rwTypes.h:23
DT_DLL_readerWriter DtString DtRemoveQuotes(const DtString &str)
static const DtObjectType & nullType()
List of DtComponentSystemDescriptor instances.
Definition: componentSystemDescriptorList.h:20
std::list< DtString > NameList
Definition: vrfXmlUtils.h:408
std::list< DtString > StringVector
Definition: vrfXmlUtils.h:278
static const char * SimObject
Definition: vrfXmlTypes.h:54
Definition: readerWriter.h:85
static DtEnvValueSP addRealElement(DtEnvironmentSP env, DtEnvValueSP root, const DtString &name, double value)
Adds a new real type to the given root and returns the new value.
Definition: vrfXmlUtils.h:121
const char DtXMLRealType[]
Definition: rwTypes.h:36
Definition: readerWriterRegistry.h:39
virtual const char * string(char sep= ':') const
static void getXYZAttrs(DtEnvironmentSP env, const DtEnvValueSP root, double &x, double &y, double &z)
Definition: vrfXmlUtils.h:390
static const char * MatchType
Definition: vrfXmlTypes.h:70
static DtEnvValueSP addBooleanAttribute(DtEnvironmentSP env, DtEnvValueSP root, const DtString &name, bool value)
Definition: vrfXmlUtils.h:136
static DtReaderWriter * CreateRwObject(const DtString &rwType)
Creates an RW object given the type.
Definition: vrfXmlUtils.h:192
const char DtXMLBodyForward[]
Definition: rwTypes.h:81
static DtEnvValueSP addStringElement(DtEnvironmentSP env, DtEnvValueSP root, const DtString &name, const DtString &value)
Convenience function.
Definition: vrfXmlUtils.h:144
static DtString GetObjectValue(DtEnvValueSP root)
Definition: vrfXmlUtils.h:95
static DtString IntToHexString(const int &number)
Definition: vrfXmlUtils.h:427
const char DtXMLObjectTypeType[]
Definition: rwTypes.h:59
static DtString MtlBindingCharToXml(const DtString &str)
Can&#39;t use &#39;$&#39; for variables. so where we would use it, as in filenames with variables, it will be replaced with &#39;@&#39;.
Definition: vrfXmlUtils.h:245
Definition: objectType.h:27
ReaderWriter object that maintains a list of reader-writer variable bindings. It keeps a list of name...
Definition: rwVariableBindings.h:27
Definition: rwVector.h:23
static DtReaderWriterFactory * factory()
static const char * ParentFile
Definition: vrfXmlTypes.h:50
static void setObjectType(DtEnvironmentSP env, DtEnvValueSP root, const DtObjectType &t)
Definition: vrfXmlUtils.h:163
const char DtXMLBooleanType[]
Definition: rwTypes.h:18
std::list< const DtRwVariableBindings * > DtVariableBindingsList
Definition: readerWriterRegistry.h:29
const char DtXMLPitch[]
Definition: vrfRwTypes.h:304
static DtObjectType getObjectType(DtEnvironmentSP env, DtEnvValueSP root)
std::vector< DtFilename > SearchPaths
Definition: readerWriter.h:92
static DtEnvValueSP addIntegerElement(DtEnvironmentSP env, DtEnvValueSP root, const DtString &name, double value)
Adds a new integer type to the given root and returns the new value.
Definition: vrfXmlUtils.h:129
static DtEnvValueSP addbooleanElement(DtEnvironmentSP env, DtEnvValueSP root, const DtString &name, bool value)
Adds a new boolean type to the given root and returns the new value.
Definition: vrfXmlUtils.h:113
static DtObjectType getObjectType(DtEnvironmentSP env, DtEnvValueSP root, bool fallbackOnMatchType=true)
Definition: vrfXmlUtils.h:378
static const char * ParamName
Definition: vrfXmlTypes.h:47
const char DtXMLParamName[]
XML types.
Definition: rwTypes.h:71
static DtObjectType getMatchType(DtEnvironmentSP env, DtEnvValueSP root, bool fallbackOnObjectType=true)
Definition: vrfXmlUtils.h:363
const char DtXMLVectorX[]
Definition: rwTypes.h:78
std::list< DtEnvValueSP > DtEnvValueSPList
Definition: vrfXmlUtils.h:44
DT_DLL_readerWriter DtString DtMtlBindingCharToXml(const DtString &str)
std::vector< DtReaderWriterRegistryData * > RegDataVector
Definition: vrfXmlUtils.h:279
static DtEnvValueSP AddElement(DtEnvironmentSP env, const DtString &type, DtEnvValueSP root, const DtString &paramName=DtString::nullString())
Definition: vrfXmlUtils.h:100
static DtEnvValueSP FindElementBySystemName(DtEnvironmentSP env, const DtString &nodeType, const DtString &attributeValue, DtEnvValueSP envValue, bool traverseElements=true)
Definition: vrfXmlUtils.h:264
static const char * SystemName
Definition: vrfXmlTypes.h:48
static void WriteVector(DtEnvironmentSP env, DtEnvValueSP root, const DtRwVector *vec, bool writeAsBodyPosition)
Definition: vrfXmlUtils.h:410
static DtString removeQuotes(const DtString &str)
Definition: vrfXmlUtils.h:347
const char DtXMLObjectType[]
Definition: vrfRwTypes.h:332
virtual DtReaderWriter * createItem(const DtString &type, const DtString &name, DtReaderWriterRegistry *parentRegistry) const
Creates a new RW type based on the type string provided, with the specified name and parent registry...
const char DtXMLBodyDown[]
Definition: rwTypes.h:83
static void setMatchType(DtEnvironmentSP env, DtEnvValueSP root, const DtObjectType &t)
Definition: vrfXmlUtils.h:168
const char DtXMLYaw[]
Definition: vrfRwTypes.h:303
static DtEnvValueSP FindElementByParamName(DtEnvironmentSP env, const DtString &nodeType, const DtString &attributeValue, DtEnvValueSP envValue, bool traverseElements=true)
Definition: vrfXmlUtils.h:256
static double getDouble(DtEnvironmentSP env, DtString attributeName, DtEnvValueSP root)
const char DtXMLBodyRight[]
Definition: rwTypes.h:82
static DtEnvValueSP addStringAttribute(DtEnvironmentSP env, DtEnvValueSP root, const DtString &name, const DtString &value)
Definition: vrfXmlUtils.h:151
std::map< DtString, DtString > GroupMappings
Definition: vrfXmlUtils.h:281
static DtString getAttribute(DtEnvironmentSP env, const DtString &name, DtEnvValueSP root)
Gets the named attribute from a DtEnvValueSP. Returns &quot;&quot; if the attribute is not found. Note that some attribute names are reserved, and will not work, for example &quot;name&quot; and &quot;type&quot;.
static void setPlatform(DtEnvironmentSP env, DtEnvValueSP root, const DtString &t)
Definition: vrfXmlUtils.h:176
static DtString XmlBindingCharToMtl(const DtString &str)
Can&#39;t use &#39;$&#39; for variables. so where we would use it, as in filenames with variables, it will be replaced with &#39;@&#39;.
Definition: vrfXmlUtils.h:240
const char DtXMLVectorY[]
Definition: rwTypes.h:79

Document ID: Generated on Mon Jun 20 00:38:30 EDT 2022 from SVN revision 244029
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)