CMS 3D CMS Logo

DDLElementRegistry.cc
Go to the documentation of this file.
31 
32 #include <cstddef>
33 #include <algorithm>
34 #include <map>
35 #include <string>
36 #include <utility>
37 #include <vector>
38 
40 
42 
43 std::shared_ptr<DDXMLElement> DDLElementRegistry::getElement(const std::string& name) {
44  RegistryMap::iterator it = registry_.find(name);
45  std::shared_ptr<DDXMLElement> myret(nullptr);
46  if (it != registry_.end()) {
47  return it->second;
48  } else {
49  // Make the Solid handlers and register them.
50  if (name == "Box") {
51  myret = std::make_shared<DDLBox>(this);
52  } else if (name == "Cone") {
53  myret = std::make_shared<DDLCone>(this);
54  } else if (name == "Polyhedra" || name == "Polycone") {
55  myret = std::make_shared<DDLPolyGenerator>(this);
56  } else if (name == "Trapezoid" || name == "Trd1") {
57  myret = std::make_shared<DDLTrapezoid>(this);
58  } else if (name == "PseudoTrap") {
59  myret = std::make_shared<DDLPseudoTrap>(this);
60  } else if (name == "Tubs" || name == "CutTubs" || name == "Tube" || name == "TruncTubs") {
61  myret = std::make_shared<DDLTubs>(this);
62  } else if (name == "Torus") {
63  myret = std::make_shared<DDLTorus>(this);
64  } else if (name == "UnionSolid" || name == "SubtractionSolid" || name == "IntersectionSolid") {
65  myret = std::make_shared<DDLBooleanSolid>(this);
66  } else if (name == "ShapelessSolid") {
67  myret = std::make_shared<DDLShapelessSolid>(this);
68  } else if (name == "Sphere") {
69  myret = std::make_shared<DDLSphere>(this);
70  } else if (name == "EllipticalTube") {
71  myret = std::make_shared<DDLEllipticalTube>(this);
72  } else if (name == "ExtrudedPolygon") {
73  myret = std::make_shared<DDLPgonGenerator>(this);
74  } else if (name == "Assembly")
75  myret = std::make_shared<DDLAssembly>(this);
76 
77  // LogicalParts, Positioners, Materials, Rotations, Reflections
78  // and Specific (Specified?) Parameters
79  else if (name == "PosPart") {
80  myret = std::make_shared<DDLPosPart>(this);
81  } else if (name == "CompositeMaterial") {
82  myret = std::make_shared<DDLCompositeMaterial>(this);
83  } else if (name == "ElementaryMaterial") {
84  myret = std::make_shared<DDLElementaryMaterial>(this);
85  } else if (name == "LogicalPart") {
86  myret = std::make_shared<DDLLogicalPart>(this);
87  } else if (name == "ReflectionRotation" || name == "Rotation") {
88  myret = std::make_shared<DDLRotationAndReflection>(this);
89  } else if (name == "SpecPar") {
90  myret = std::make_shared<DDLSpecPar>(this);
91  } else if (name == "RotationSequence") {
92  myret = std::make_shared<DDLRotationSequence>(this);
93  } else if (name == "RotationByAxis") {
94  myret = std::make_shared<DDLRotationByAxis>(this);
95  }
96  // Special, need them around.
97  else if (name == "SpecParSection") {
98  myret = std::make_shared<DDXMLElement>(this, true);
99  } else if (name == "Vector") {
100  myret = std::make_shared<DDLVector>(this);
101  } else if (name == "Map") {
102  myret = std::make_shared<DDLMap>(this);
103  } else if (name == "String") {
104  myret = std::make_shared<DDLString>(this);
105  } else if (name == "Numeric") {
106  myret = std::make_shared<DDLNumeric>(this);
107  } else if (name == "Algorithm") {
108  myret = std::make_shared<DDLAlgorithm>(this);
109  } else if (name == "Division") {
110  myret = std::make_shared<DDLDivision>(this);
111  }
112 
113  // Supporting Cast of elements.
114  // All elements which simply accumulate attributes which are then used
115  // by one of the above elements.
116  else if (name == "MaterialFraction" || name == "RZPoint" || name == "XYPoint" || name == "PartSelector" ||
117  name == "Parameter" || name == "ZSection" || name == "ZXYSection" || name == "Translation" ||
118  name == "rSolid" || name == "rMaterial" || name == "rParent" || name == "rChild" || name == "rRotation" ||
119  name == "rReflectionRotation" || name == "DDDefinition") {
120  myret = std::make_shared<DDXMLElement>(this);
121  }
122 
123  // IF it is a new element return a default XMLElement which processes nothing.
124  // Since there are elements in the XML which require no processing, they
125  // can all use the same DDXMLElement which defaults to anything. A validated
126  // XML document (i.e. validated with XML Schema) will work properly.
127  // As of 8/16/2002: Elements like LogicalPartSection and any other *Section
128  // XML elements of the DDLSchema are taken care of by this.
129  else {
130  myret = std::make_shared<DDXMLElement>(this);
131  }
132 
133  // Actually register the thing
134  registry_[name] = myret;
135  }
136  return myret;
137 }
std::shared_ptr< DDXMLElement > getElement(const std::string &name)
THE most important part. Getting the pointer to a given element type.