VR-Forces 4.2 Class Documentation
xmlToRw.h
Go to the documentation of this file.
1 #pragma once
2 
4 #include "vrfutil/rwInt.h"
5 #include "vrfutil/rwReal.h"
6 #include "vrfutil/rwString.h"
7 #include "vrfutil/rwVector.h"
8 #include "vrfutil/rwBoolean.h"
9 #include "vrfutil/rsrcMgr.h"
12 #include "vrfutil/rwTypes.h"
13 #include "vrfutil/rwEntType.h"
17 #include "mtl/env.h"
18 #include "mtl/envXMLWriter.h"
20 #include "vrfobjparam/vrfParamDb.h"
23 #include "vrfutil/rwRegData.h"
25 #include "extMtl/extDtcRead.h"
26 #include "vrfExtProtocol/objType.h"
27 #include "vrfExtProtocol/rangedObjType.h"
29 #include "vrfutil/nLenIntVec.h"
32 #include "vrfutil/subObjList.h"
33 #include "vrfutil/subObjEntry.h"
34 #include "vrfutil/formTbl.h"
35 #include "vrfutil/formTblEntry.h"
36 #include "vrfutil/soilList.h"
37 #include "vrfutil/soilFactors.h"
38 
39 #include "vlutil/vlStringUtil.h"
40 #include "vlutil/vlFilename.h"
41 
42 #include <boost/function.hpp>
43 #include <boost/lexical_cast.hpp>
44 
45 #include <iostream>
46 
48 {
49 public:
50 
54 
55  typedef boost::function<void (DtReaderWriter* rwObject)> AddFunction;
56 
58  {
59  RwObjectAdder(DtRwList* list) : myList(list) {}
60  void operator()(DtReaderWriter* rwObject)
61  {
62  myList->add(rwObject);
63  }
65  };
66 
68  {
70  void operator()(DtReaderWriter* rwObject)
71  {
72  myList->addSubObjectEntry(*static_cast<DtVrfSubObjectParameterEntry*>(rwObject));
73  }
75  };
76 
78  {
80  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
81  : myFormations(formations)
82  , mySearchPath(searchPath)
83  , myBindings(bindings)
84  {
85 
86  }
87 
88  void operator()(DtReaderWriter* rwObject)
89  {
90  DtFormationTableEntry* entry = static_cast<DtFormationTableEntry*>(rwObject);
91  entry->formationFile().loadFile(mySearchPath, myBindings);
92  myFormations->addFormationEntry(entry);
93  }
95  const DtFilename& mySearchPath;
97  };
98 
100  {
101  SoilFactorsAdder(DtRwList* list) : myList()
102  {
103  myList = static_cast<DtSoilList*>(list);
104  }
105 
106  void operator()(DtReaderWriter* rwObject)
107  {
108  DtSoilFactors* factors = static_cast<DtSoilFactors*>(rwObject);
109  myList->addSoilFactors(*factors);
110  }
112  };
113 
117 
121  template <class RwType, class basicType>
122  static void DtEnvValueToBasicType(DtEnvironmentSP,
123  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
124  const DtFilename&, const DtVariableBindingsList&)
125  {
126  DtString bindingValue = envObject->value();
127  RwType* rwTypeObject = static_cast<RwType*>(rwObject);
128  (*rwTypeObject) = boost::lexical_cast<basicType>(bindingValue.c_str());
129  }
130 
131  static void DtEnvValueToRwBool(DtEnvironmentSP,
132  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
133  const DtFilename&, const DtVariableBindingsList&)
134  {
135  DtRwBoolean* rwBool = static_cast<DtRwBoolean*>(rwObject);
136  DtString bindingValue = envObject->value();
137  (*rwBool) = DtXmlUtils::ToBool(bindingValue);
138  }
139 
140  static void DtEnvValueToRwString(DtEnvironmentSP,
141  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
142  const DtFilename&, const DtVariableBindingsList&)
143  {
144  DtRwString* rwString = static_cast<DtRwString*>(rwObject);
145  DtString bindingValue = DtXmlUtils::XmlBindingCharToMtl(envObject->value());
146  (*rwString) = bindingValue;
147  }
148 
149 
151  static void DtEnvValueToRwVector(DtEnvironmentSP env,
152  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
153  const DtFilename&, const DtVariableBindingsList&)
154  {
155  DtRwVector* rwVector = static_cast<DtRwVector*>(rwObject);
156  DtXmlUtils::getXYZAttrs(env, envObject, (*rwVector)[0], (*rwVector)[1], (*rwVector)[2]);
157  }
158 
160  static void DtEnvValueToRwOffsetVector(DtEnvironmentSP env,
161  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
162  const DtFilename&, const DtVariableBindingsList&)
163  {
164  DtRwOffsetVector* rwVector = static_cast<DtRwOffsetVector*>(rwObject);
165  DtXmlUtils::getXYZAttrs(env, envObject, (*rwVector)[0], (*rwVector)[1], (*rwVector)[2]);
166  }
167 
168  static void DtEnvValueToRwList(DtEnvironmentSP env,
169  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
170  const DtFilename& searchPath, const DtVariableBindingsList& bindings,
171  const vrfXml::TypeList& bindingTypes)
172  {
173  DtRwList* rwList = static_cast<DtRwList*>(rwObject);
174  RwObjectAdder adder(rwList);
175  DtXmlUtils::PopulateList(boost::ref(adder), env, envObject, searchPath, bindings, bindingTypes);
176  }
177 
178  static void DtEnvValueToRwBoundingVolume(DtEnvironmentSP env,
179  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
180  const DtFilename&, const DtVariableBindingsList&)
181  {
182  DtRwBoundingVolume* rwBVolume = static_cast<DtRwBoundingVolume*>(rwObject);
183  DtEnvValueSP dimensions = env->getObject(vrfXml::Dimensions, vrfXml::Dimensions, envObject);
184 
185  double length = DtXmlUtils::getDoubleAttribute(env, vrfXml::Length, dimensions);
186  double width = DtXmlUtils::getDoubleAttribute(env, vrfXml::Width, dimensions);
187  double height = DtXmlUtils::getDoubleAttribute(env, vrfXml::Height, dimensions);
188  rwBVolume->setHalfLengthWidthHeight(length/2, width/2, height/2);
189 
190  DtString offsetType = DtXmlUtils::getAttribute(env, vrfXml::OffsetType, envObject);
191  if (offsetType == vrfXml::OffsetTypeCenter)
192  {
193  rwBVolume->setLatticeOffset(0.0, 0.0, 0.0);
194  }
195  else if (offsetType == vrfXml::OffsetTypeGroundCenter)
196  {
197  rwBVolume->setLatticeOffset(0.0, 0.0, -height/2);
198  }
199  else if (offsetType == vrfXml::OffsetTypeCustom)
200  {
201  DtEnvValueSP offset = env->getObject(vrfXml::Offset, vrfXml::Offset, envObject);
202  double forward = DtXmlUtils::getDoubleAttribute(env, vrfXml::BodyForward, offset);
203  double right = DtXmlUtils::getDoubleAttribute(env, vrfXml::BodyRight, offset);
204  double up = DtXmlUtils::getDoubleAttribute(env, vrfXml::BodyDown, offset);
205  rwBVolume->setLatticeOffset(forward, right, up);
206  }
207  }
208 
209  static void DtEnvValueToRwLoadPoints(DtEnvironmentSP env,
210  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
211  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
212  {
213  vrfXml::TypeList types;
214  types.push_back(vrfXml::LoadPoint);
215  DtRwList* rwList = static_cast<DtRwList*>(rwObject);
216  RwObjectAdder adder(rwList);
217  DtXmlUtils::PopulateList(boost::ref(adder), env, envObject, searchPath, bindings, types);
218  }
219 
220  static void DtEnvValueToRwLoadPoint(DtEnvironmentSP env,
221  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
222  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
223  {
224  DtLoadPoint* loadPoint = static_cast<DtLoadPoint*>(rwObject);
225  DtString supportedSlots = DtXmlUtils::getAttribute(env, vrfXml::SupportedSlots, envObject);
226 
227  DtXmlUtils::StringToNLengthIntList(supportedSlots, loadPoint->supportedSlots());
228 
229  vrfXml::TypeList types;
230  types.push_back(vrfXml::Vector);
231  RwObjectAdder adder(&loadPoint->points());
232  DtXmlUtils::PopulateList(boost::ref(adder), env, envObject, searchPath, bindings, types);
233  }
234 
235  static void DtEnvValueToEmbarkationSlots(DtEnvironmentSP env,
236  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
237  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
238  {
239  vrfXml::TypeList types;
240  types.push_back(vrfXml::EmbarkationSlot);
241  RwObjectAdder adder(static_cast<DtRwList*>(rwObject));
242  DtXmlUtils::PopulateList(boost::ref(adder), env, envObject, searchPath, bindings, types);
243  }
244 
245  static void DtEnvValueToEmbarkationSlot(DtEnvironmentSP env,
246  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
247  const DtFilename&, const DtVariableBindingsList&)
248  {
249  DtEmbarkationSlotEntry* embSlot = static_cast<DtEmbarkationSlotEntry*>(rwObject);
252  embSlot->setNumberOfEntities(DtXmlUtils::getInt(env, vrfXml::Capacity, envObject));
255 
256  DtEnvValueSP embarkedPosition = env->getObject(vrfXml::EmbarkedPosition, vrfXml::EmbarkedPosition, envObject);
257  double x, y, z;
258  DtXmlUtils::getXYZAttrs(env, embarkedPosition, x, y, z);
259  embSlot->setPosition(DtVector(x, y, z));
260 
261  DtTaitBryan orientation;
262 
263  DtEnvValueSP embarkedHeading = env->getObject(vrfXml::EmbarkedHeading, vrfXml::EmbarkedHeading, envObject);
264  if (embarkedHeading.get())
265  {
266  orientation.setPsi(DtDeg2Rad(boost::lexical_cast<double>(embarkedHeading->value().c_str())));
267  }
268  else
269  {
270  DtEnvValueSP embarkedOrientation = env->getObject(vrfXml::EmbarkedOrientation, vrfXml::EmbarkedOrientation, envObject);
271  DtXmlUtils::getOrientation(env, embarkedOrientation, orientation);
272  }
273 
274  embSlot->setOrientation(orientation);
275  }
276 
277  static void DtEnvValueToSubObjectList(DtEnvironmentSP env,
278  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
279  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
280  {
281  vrfXml::TypeList types;
282  types.push_back(vrfXml::Subordinate);
283  SubordinateAdder adder(static_cast<DtVrfSubObjectParameterList*>(rwObject));
284  DtXmlUtils::PopulateList(boost::ref(adder), env, envObject, searchPath, bindings, types);
285  }
286 
287  static void DtEnvValueToSubObject(DtEnvironmentSP env,
288  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
289  const DtFilename&, const DtVariableBindingsList&)
290  {
291  DtVrfSubObjectParameterEntry* rwSub = static_cast<DtVrfSubObjectParameterEntry*>(rwObject);
292  rwSub->setObjectType(DtXmlUtils::getMatchType(env, envObject));
294  double x, y, z;
295  DtXmlUtils::getXYZAttrs(env, envObject, x, y, z);
296  rwSub->setPositionOffset(DtVector(x, y, z));
297  }
298 
299  static void DtEnvValueToFormationList(DtEnvironmentSP env,
300  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
301  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
302  {
303  vrfXml::TypeList types;
304  types.push_back(vrfXml::Formation);
305  DtFormationTable* rwFormations = static_cast<DtFormationTable*>(rwObject);
306  FormationAdder adder(rwFormations, searchPath, bindings);
307  DtXmlUtils::PopulateList(boost::ref(adder), env, envObject, searchPath, bindings, types);
308 
310  }
311 
312  static void DtEnvValueToFormationTableEntry(DtEnvironmentSP env,
313  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
314  const DtFilename&, const DtVariableBindingsList&)
315  {
316  DtFormationTableEntry* formation = static_cast<DtFormationTableEntry*>(rwObject);
317  formation->setFormationName(DtXmlUtils::getAttribute(env, vrfXml::FormationName, envObject).c_str());
318  formation->formationFile() = DtXmlUtils::getAttribute(env, vrfXml::FormationFile, envObject).c_str();
319  }
320 
321  static void DtEnvValueToNLengthStringVector(DtEnvironmentSP env,
322  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
323  const DtFilename&, const DtVariableBindingsList&)
324  {
325  DtRwNLengthStringVector* vector = static_cast<DtRwNLengthStringVector*>(rwObject);
326  DtString strings = envObject->value();
327  DtXmlUtils::StringToNLengthStringList(strings, *vector);
328  }
329 
330  static void DtEnvValueToRwSoilList(DtEnvironmentSP env,
331  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
332  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
333  {
334  vrfXml::TypeList types;
335  types.push_back(vrfXml::SoilFactors);
336  DtRwList* rwList = static_cast<DtRwList*>(rwObject);
337  SoilFactorsAdder adder(rwList);
338  DtXmlUtils::PopulateList(boost::ref(adder), env, envObject, searchPath, bindings, types);
339  }
340 
341  static void DtEnvValueToRwSoilFactors(DtEnvironmentSP env,
342  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
343  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
344  {
345  DtSoilFactors* factors = static_cast<DtSoilFactors*>(rwObject);
346  factors->setName(DtXmlUtils::getAttribute(env, vrfXml::SoilType, envObject).c_str());
350  }
351 
352  static void DtEnvValueToRwTaitBryan(DtEnvironmentSP env,
353  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
354  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
355  {
356  DtRwTaitBryan* taitBryan = static_cast<DtRwTaitBryan*>(rwObject);
357  taitBryan->setPhi(DtXmlUtils::getDoubleAttribute(env, vrfXml::Yaw, envObject));
358  taitBryan->setTheta(DtXmlUtils::getDoubleAttribute(env, vrfXml::Pitch, envObject));
359  taitBryan->setPsi(DtXmlUtils::getDoubleAttribute(env, vrfXml::Roll, envObject));
360  }
361 
362  static void DtEnvValueToRwEntityType(DtEnvironmentSP env,
363  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
364  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
365  {
366  DtRwEntityType* entityType = static_cast<DtRwEntityType*>(rwObject);
367  (*entityType) = envObject->value().c_str();
368  }
369 
370  static void DtEnvValueToRwBoundingGeometryType(DtEnvironmentSP env,
371  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
372  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
373  {
374  DtRwBoundingGeometryType* bgType = static_cast<DtRwBoundingGeometryType*>(rwObject);
375  DtString value = envObject->value();
376  if (value == vrfXml::BoundingGeometryArea)
378  else if (value == vrfXml::BoundingGeometryVolume)
380  else if (value == vrfXml::BoundingGeometryUndefined)
382  else
383  DtWarn << "Unknown bounding geometry type " << value << std::endl;
384  }
385 
386  static void DtEnvValueToSlotExclusions(DtEnvironmentSP env,
387  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
388  const DtFilename& searchPath, const DtVariableBindingsList& bindings)
389  {
390  vrfXml::TypeList types;
391  types.push_back(vrfXml::SlotExclusion);
392  DtRwList* rwList = static_cast<DtRwList*>(rwObject);
393  RwObjectAdder adder(rwList);
394  DtXmlUtils::PopulateList(boost::ref(adder), env, envObject, searchPath, bindings, types);
395  }
396 
397  static void DtEnvValueToSlotExclusion(DtEnvironmentSP env,
398  const DtEnvValueSP envObject, DtReaderWriter* rwObject,
399  const DtFilename&, const DtVariableBindingsList&)
400  {
401  DtSlotExclusion* exclusion = static_cast<DtSlotExclusion*>(rwObject);
402 
403  DtString ifSlotsReserved = DtXmlUtils::getAttribute(env, vrfXml::IfSlotsReserved, envObject);
404  DtNLengthIntegerVector ifReservedList;
405  DtXmlUtils::StringToNLengthIntList(ifSlotsReserved, ifReservedList);
406  exclusion->setIfSlotsReserved(ifReservedList);
407 
408  DtString excludeTheseSlots = DtXmlUtils::getAttribute(env, vrfXml::ExcludeTheseSlots, envObject);
409  DtNLengthIntegerVector excludeList;
410  DtXmlUtils::StringToNLengthIntList(excludeTheseSlots, excludeList);
411  exclusion->setExcludeTheseSlots(excludeList);
412  }
413 
417 
418  //Handles assignment from DtEnvValueSP objects to DtReaderWriter objects
420  {
421  public:
422  typedef boost::function<void (DtEnvironmentSP, DtEnvValueSP, DtReaderWriter*,
423  const DtFilename&, const DtVariableBindingsList&)> ConversionFunction;
424 
426  : myRwConverters()
427  {
428  registerConverter(vrfXml::Int, &DtEnvValueToBasicType<DtRwInt, int>);
429  registerConverter(vrfXml::Real, &DtEnvValueToBasicType<DtRwReal, double>);
430  registerConverter(vrfXml::String, &DtEnvValueToRwString);
431  registerConverter(vrfXml::BodyPosition, &DtEnvValueToRwOffsetVector);
432  registerConverter(vrfXml::Vector, &DtEnvValueToRwVector);
433  registerConverter(vrfXml::Bool, &DtEnvValueToRwBool);
434  registerConverter(vrfXml::BoundingVolume, &DtEnvValueToRwBoundingVolume);
435  registerConverter(vrfXml::LoadPoints, &DtEnvValueToRwLoadPoints);
436  registerConverter(vrfXml::LoadPoint, &DtEnvValueToRwLoadPoint);
437  registerConverter(vrfXml::EmbarkationSlots, &DtEnvValueToEmbarkationSlots);
438  registerConverter(vrfXml::EmbarkationSlot, &DtEnvValueToEmbarkationSlot);
439  registerConverter(vrfXml::Subordinates, &DtEnvValueToSubObjectList);
440  registerConverter(vrfXml::Subordinate, &DtEnvValueToSubObject);
441  registerConverter(vrfXml::Formations, &DtEnvValueToFormationList);
442  registerConverter(vrfXml::Formation, &DtEnvValueToFormationTableEntry);
443  registerConverter(vrfXml::StringList, &DtEnvValueToNLengthStringVector);
444  registerConverter(vrfXml::SoilList, &DtEnvValueToRwSoilList);
445  registerConverter(vrfXml::SoilFactors, &DtEnvValueToRwSoilFactors);
446  registerConverter(vrfXml::Orientation, &DtEnvValueToRwTaitBryan);
447  registerConverter(vrfXml::EntityType, &DtEnvValueToRwEntityType);
448  registerConverter(vrfXml::BoundingGeometryType, &DtEnvValueToRwBoundingGeometryType);
449  registerConverter(vrfXml::SlotExclusions, &DtEnvValueToSlotExclusions);
450  registerConverter(vrfXml::SlotExclusion, &DtEnvValueToSlotExclusion);
451  }
452 
453  void convert(DtEnvironmentSP env, const DtFilename& searchPath,
454  const DtVariableBindingsList& bindings, DtEnvValueSP envValue, DtReaderWriter* rwObject)
455  {
456  if (!envValue.get())
457  {
458  DtWarn << "DtXmlRWFactory::convert null env value" << std::endl;
459  return;
460  }
461  if (!rwObject)
462  {
463  DtWarn << "DtXmlRWFactory::convert null rw object" << std::endl;
464  return;
465  }
466 
467  DtString xmlType = vrfXml::RwTypeToXmlType(rwObject);
468  if (myRwConverters.find(xmlType) != myRwConverters.end())
469  {
470  myRwConverters[xmlType](env, envValue, rwObject, searchPath, bindings);
471  }
472  else
473  {
474  DtWarn << "DtXmlRWFactory: No Converter for type "
475  << rwObject->readerWriterType() << std::endl;
476  }
477  }
478 
479  void registerConverter(DtString type, ConversionFunction conversionFunction)
480  {
481  myRwConverters[type] = conversionFunction;
482  }
483 
484  protected:
485  std::map<DtString, ConversionFunction> myRwConverters;
486  };
487 
488  static Converter& getConverter();
489 
490  static void Convert(DtEnvironmentSP env, DtEnvValueSP envValue, DtReaderWriter* rwObject);
491 };

Document ID: Generated on Sun Nov 24 19:49:21 EST 2013 from SVN revision 133924
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)