Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // G4GDMLWrite 27 // 28 // Class description: 29 // 30 // GDML writer. 31 32 // Author: Zoltan Torzsok, November 2007 33 // -------------------------------------------------------------------- 34 #ifndef G4GDMLWRITE_HH 35 #define G4GDMLWRITE_HH 1 36 37 #include <map> 38 39 #include <xercesc/dom/DOM.hpp> 40 #include <xercesc/util/XMLString.hpp> 41 #include <xercesc/util/PlatformUtils.hpp> 42 #include <xercesc/framework/LocalFileFormatTarget.hpp> 43 44 #include "G4Transform3D.hh" 45 46 #include "G4GDMLAuxStructType.hh" 47 48 class G4LogicalVolume; 49 class G4VPhysicalVolume; 50 51 class G4GDMLWrite 52 { 53 using VolumeMapType = std::map<const G4LogicalVolume*, G4Transform3D>; 54 using PhysVolumeMapType = std::map<const G4VPhysicalVolume*, G4String>; 55 using DepthMapType = std::map<G4int, G4int>; 56 57 public: 58 59 G4Transform3D Write(const G4String& filename, 60 const G4LogicalVolume* const topLog, 61 const G4String& schemaPath, const G4int depth, 62 G4bool storeReferences = true); 63 // 64 // Main method for writing GDML files. 65 66 void AddModule(const G4VPhysicalVolume* const topVol); 67 void AddModule(const G4int depth); 68 // 69 // Split geometry structure in modules, by volume subtree or level. 70 71 void AddAuxiliary(G4GDMLAuxStructType myaux); 72 // 73 // Import auxiliary structure. 74 75 void SetOutputFileOverwrite(G4bool flag); 76 // 77 // Set the flag to allow overwriting of the output GDML file 78 79 static void SetAddPointerToName(G4bool); 80 // 81 // Specify if to add or not memory addresses to IDs. 82 83 virtual void DefineWrite(xercesc::DOMElement*) = 0; 84 virtual void MaterialsWrite(xercesc::DOMElement*) = 0; 85 virtual void SolidsWrite(xercesc::DOMElement*) = 0; 86 virtual void StructureWrite(xercesc::DOMElement*) = 0; 87 virtual G4Transform3D TraverseVolumeTree(const G4LogicalVolume* const, 88 const G4int) = 0; 89 virtual void SurfacesWrite() = 0; 90 virtual void SetupWrite(xercesc::DOMElement*, 91 const G4LogicalVolume* const) = 0; 92 // 93 // Pure virtual methods implemented in concrete writer plugin's classes. 94 95 virtual void ExtensionWrite(xercesc::DOMElement*); 96 virtual void UserinfoWrite(xercesc::DOMElement*); 97 virtual void AddExtension(xercesc::DOMElement*, 98 const G4LogicalVolume* const); 99 // 100 // To be implemented in the client code for handling extensions 101 // to the GDML schema, identified with the tag "extension". 102 // The implementation should be placed inside a user-class 103 // inheriting from G4GDMLWriteStructure and being registered 104 // as argument to G4GDMLParser. 105 106 G4String GenerateName(const G4String&, const void* const); 107 108 protected: 109 110 G4GDMLWrite(); 111 virtual ~G4GDMLWrite(); 112 113 VolumeMapType& VolumeMap(); 114 115 xercesc::DOMAttr* NewAttribute(const G4String&, const G4String&); 116 xercesc::DOMAttr* NewAttribute(const G4String&, const G4double&); 117 xercesc::DOMElement* NewElement(const G4String&); 118 G4String Modularize(const G4VPhysicalVolume* const topvol, 119 const G4int depth); 120 121 void AddAuxInfo(G4GDMLAuxListType* auxInfoList, 122 xercesc::DOMElement* element); 123 124 G4bool FileExists(const G4String&) const; 125 PhysVolumeMapType& PvolumeMap(); 126 DepthMapType& DepthMap(); 127 128 protected: 129 130 G4String SchemaLocation; 131 static G4bool addPointerToName; 132 xercesc::DOMDocument* doc = nullptr; 133 xercesc::DOMElement* extElement = nullptr; 134 xercesc::DOMElement* userinfoElement = nullptr; 135 136 G4GDMLAuxListType auxList; 137 G4bool overwriteOutputFile = false; 138 }; 139 140 #endif 141