- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/FillAction/FillRegularGridAction.cpp
r26b4d62 rcae614 44 44 #include "Filling/Cluster.hpp" 45 45 #include "Filling/Filler.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" 46 #include "Filling/Preparators/BoxFillerPreparator.hpp" 54 47 #include "molecule.hpp" 55 48 #include "MoleculeListClass.hpp" 56 49 #include "Parser/FormatParserInterface.hpp" 57 50 #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"63 51 #include "World.hpp" 64 65 52 66 53 #include <algorithm> … … 92 79 LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms."); 93 80 94 // c heck for selected molecules and create surfaces from them95 std::vector<atom *> atoms(World::getInstance().getSelectedAtoms());96 FillPredicate * surface_predicate = NULL; 97 LinkedCell_deprecated * LC = NULL;98 Tesselation * TesselStruct = NULL;81 // center filler's tip at origin 82 filler->CenterEdge(); 83 84 // prepare the filler preparator 85 BoxFillerPreparator filler_preparator(filler); 99 86 if (params.SphereRadius.get() != 0.) { 100 if ( atoms.size() == 0) {87 if (World::getInstance().beginAtomSelection() == World::getInstance().endAtomSelection()) { 101 88 STATUS("You have given a sphere radius "+toString(params.SphereRadius.get()) 102 89 +" != 0, but have not select any atoms."); 103 90 return Action::failure; 104 91 } 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 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 112 bool successflag = false; 118 113 FillRegularGridState *UndoState = NULL; 119 bool successflag = false;120 114 { 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 139 115 // fill 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 } 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 } 180 139 } 181 182 // remove 183 delete mesh; 184 delete inserter; 185 delete voidnode_predicate; 186 delete surface_predicate; 187 delete LC; 188 delete TesselStruct; 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 } 189 155 } 190 156
Note:
See TracChangeset
for help on using the changeset viewer.