- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/FillAction/FillRegularGridAction.cpp
rcae614 r26b4d62 44 44 #include "Filling/Cluster.hpp" 45 45 #include "Filling/Filler.hpp" 46 #include "Filling/Preparators/BoxFillerPreparator.hpp" 46 #include "Filling/Inserter/Inserter.hpp" 47 #include "Filling/Inserter/RandomInserter.hpp" 48 #include "Filling/Mesh/CubeMesh.hpp" 49 #include "Filling/Predicates/IsInsideSurface_FillPredicate.hpp" 50 #include "Filling/Predicates/IsVoidNode_FillPredicate.hpp" 51 #include "Filling/Predicates/Ops_FillPredicate.hpp" 52 #include "LinkedCell/linkedcell.hpp" 53 #include "LinkedCell/PointCloudAdaptor.hpp" 47 54 #include "molecule.hpp" 48 55 #include "MoleculeListClass.hpp" 49 56 #include "Parser/FormatParserInterface.hpp" 50 57 #include "Parser/FormatParserStorage.hpp" 58 #include "Shapes/BaseShapes.hpp" 59 #include "Tesselation/tesselation.hpp" 60 #include "Tesselation/BoundaryLineSet.hpp" 61 #include "Tesselation/BoundaryTriangleSet.hpp" 62 #include "Tesselation/CandidateForTesselation.hpp" 51 63 #include "World.hpp" 64 52 65 53 66 #include <algorithm> … … 79 92 LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms."); 80 93 81 // c enter filler's tip at origin82 filler->CenterEdge();83 84 // prepare the filler preparator85 BoxFillerPreparator filler_preparator(filler);94 // check for selected molecules and create surfaces from them 95 std::vector<atom *> atoms(World::getInstance().getSelectedAtoms()); 96 FillPredicate * surface_predicate = NULL; 97 LinkedCell_deprecated * LC = NULL; 98 Tesselation * TesselStruct = NULL; 86 99 if (params.SphereRadius.get() != 0.) { 87 if ( World::getInstance().beginAtomSelection() == World::getInstance().endAtomSelection()) {100 if ( atoms.size() == 0) { 88 101 STATUS("You have given a sphere radius "+toString(params.SphereRadius.get()) 89 102 +" != 0, but have not select any atoms."); 90 103 return Action::failure; 91 104 } 92 std::vector<atom*> atoms(World::getInstance().getSelectedAtoms()); 93 filler_preparator.addSurfacePredicate( 94 params.SphereRadius.get(), 95 atoms); 96 } 97 filler_preparator.addVoidPredicate(params.mindistance.get()); 98 filler_preparator.addRandomInserter( 99 params.RandAtomDisplacement.get(), 100 params.RandMoleculeDisplacement.get(), 101 params.DoRotate.get()); 102 filler_preparator.addCubeMesh( 103 params.counts.get(), 104 params.offset.get(), 105 World::getInstance().getDomain().getM()); 106 if (!filler_preparator()) { 107 STATUS("Filler was not fully constructed."); 108 return Action::failure; 109 } 110 111 // use filler 105 // create adaptor for the selected atoms 106 PointCloudAdaptor< std::vector<atom *> > cloud(&atoms, std::string("Selected atoms")); 107 108 // create tesselation 109 LC = new LinkedCell_deprecated(cloud, 2.*params.SphereRadius.get()); 110 TesselStruct = new Tesselation; 111 (*TesselStruct)(cloud, params.SphereRadius.get()); 112 113 // and create predicate 114 surface_predicate = new FillPredicate( IsInsideSurface_FillPredicate( *TesselStruct, *LC ) ); 115 } 116 117 // create predicate, mesh, and filler 118 FillRegularGridState *UndoState = NULL; 112 119 bool successflag = false; 113 FillRegularGridState *UndoState = NULL;114 120 { 121 FillPredicate *voidnode_predicate = new FillPredicate( 122 IsVoidNode_FillPredicate( 123 Sphere(zeroVec, params.mindistance.get()) 124 ) 125 ); 126 FillPredicate Andpredicate = (*voidnode_predicate); 127 if (surface_predicate != NULL) 128 Andpredicate = (Andpredicate) && !(*surface_predicate); 129 Mesh *mesh = new CubeMesh(params.counts.get(), params.offset.get(), World::getInstance().getDomain().getM()); 130 Inserter *inserter = new Inserter( 131 Inserter::impl_ptr( 132 new RandomInserter( 133 params.RandAtomDisplacement.get(), 134 params.RandMoleculeDisplacement.get(), 135 params.DoRotate.get()) 136 ) 137 ); 138 115 139 // fill 116 Filler *fillerFunction = filler_preparator.obtainFiller(); 117 // TODO: When molecule::getBoundingSphere() does not use a sphere anymore, 118 // we need to check whether we rotate the molecule randomly. For this to 119 // work we need a sphere! 120 const Shape s = filler->getBoundingSphere(params.RandAtomDisplacement.get()); 121 ClusterInterface::Cluster_impl cluster( new Cluster(filler->getAtomIds(), s) ); 122 CopyAtoms_withBonds copyMethod; 123 Filler::ClusterVector_t ClonedClusters; 124 successflag = (*fillerFunction)(copyMethod, cluster, ClonedClusters); 125 delete fillerFunction; 126 127 // append each cluster's atoms to clonedatoms (however not selected ones) 128 std::vector<const atom *> clonedatoms; 129 std::vector<AtomicInfo> clonedatominfos; 130 for (Filler::ClusterVector_t::const_iterator iter = ClonedClusters.begin(); 131 iter != ClonedClusters.end(); ++iter) { 132 const AtomIdSet &atoms = (*iter)->getAtomIds(); 133 clonedatoms.reserve(clonedatoms.size()+atoms.size()); 134 for (AtomIdSet::const_iterator atomiter = atoms.begin(); atomiter != atoms.end(); ++atomiter) 135 if (!filler->containsAtom(*atomiter)) { 136 clonedatoms.push_back( *atomiter ); 137 clonedatominfos.push_back( AtomicInfo(*(*atomiter)) ); 138 } 140 { 141 Filler *fillerFunction = new Filler(*mesh, Andpredicate, *inserter); 142 // TODO: When molecule::getBoundingSphere() does not use a sphere anymore, 143 // we need to check whether we rotate the molecule randomly. For this to 144 // work we need a sphere! 145 const Shape s = filler->getBoundingSphere(params.RandAtomDisplacement.get()); 146 ClusterInterface::Cluster_impl cluster( new Cluster(filler->getAtomIds(), s) ); 147 CopyAtoms_withBonds copyMethod; 148 Filler::ClusterVector_t ClonedClusters; 149 successflag = (*fillerFunction)(copyMethod, cluster, ClonedClusters); 150 delete fillerFunction; 151 152 // append each cluster's atoms to clonedatoms (however not selected ones) 153 std::vector<const atom *> clonedatoms; 154 std::vector<AtomicInfo> clonedatominfos; 155 for (Filler::ClusterVector_t::const_iterator iter = ClonedClusters.begin(); 156 iter != ClonedClusters.end(); ++iter) { 157 const AtomIdSet &atoms = (*iter)->getAtomIds(); 158 clonedatoms.reserve(clonedatoms.size()+atoms.size()); 159 for (AtomIdSet::const_iterator atomiter = atoms.begin(); atomiter != atoms.end(); ++atomiter) 160 if (!filler->containsAtom(*atomiter)) { 161 clonedatoms.push_back( *atomiter ); 162 clonedatominfos.push_back( AtomicInfo(*(*atomiter)) ); 163 } 164 } 165 std::vector< BondInfo > clonedbonds; 166 StoreBondInformationFromAtoms(clonedatoms, clonedbonds); 167 LOG(2, "DEBUG: There are " << clonedatominfos.size() << " newly created atoms."); 168 169 if (!successflag) { 170 STATUS("Insertion failed, removing inserted clusters, translating original one back"); 171 RemoveAtomsFromAtomicInfo(clonedatominfos); 172 clonedatoms.clear(); 173 SetAtomsFromAtomicInfo(movedatoms); 174 } else { 175 std::vector<Vector> MovedToVector(filler->size(), zeroVec); 176 std::transform(filler->begin(), filler->end(), MovedToVector.begin(), 177 boost::bind(&AtomInfo::getPosition, _1) ); 178 UndoState = new FillRegularGridState(clonedatominfos,clonedbonds,movedatoms,MovedToVector,params); 179 } 139 180 } 140 std::vector< BondInfo > clonedbonds; 141 StoreBondInformationFromAtoms(clonedatoms, clonedbonds); 142 LOG(2, "DEBUG: There are " << clonedatominfos.size() << " newly created atoms."); 143 144 if (!successflag) { 145 STATUS("Insertion failed, removing inserted clusters, translating original one back"); 146 RemoveAtomsFromAtomicInfo(clonedatominfos); 147 clonedatoms.clear(); 148 SetAtomsFromAtomicInfo(movedatoms); 149 } else { 150 std::vector<Vector> MovedToVector(filler->size(), zeroVec); 151 std::transform(filler->begin(), filler->end(), MovedToVector.begin(), 152 boost::bind(&AtomInfo::getPosition, _1) ); 153 UndoState = new FillRegularGridState(clonedatominfos,clonedbonds,movedatoms,MovedToVector,params); 154 } 181 182 // remove 183 delete mesh; 184 delete inserter; 185 delete voidnode_predicate; 186 delete surface_predicate; 187 delete LC; 188 delete TesselStruct; 155 189 } 156 190
Note:
See TracChangeset
for help on using the changeset viewer.