Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/FillAction/FillRegularGridAction.cpp

    r26b4d62 rcae614  
    4444#include "Filling/Cluster.hpp"
    4545#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"
    5447#include "molecule.hpp"
    5548#include "MoleculeListClass.hpp"
    5649#include "Parser/FormatParserInterface.hpp"
    5750#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"
    6351#include "World.hpp"
    64 
    6552
    6653#include <algorithm>
     
    9279  LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms.");
    9380
    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;
     81  // center filler's tip at origin
     82  filler->CenterEdge();
     83
     84  // prepare the filler preparator
     85  BoxFillerPreparator filler_preparator(filler);
    9986  if (params.SphereRadius.get() != 0.) {
    100     if ( atoms.size() == 0) {
     87    if (World::getInstance().beginAtomSelection() == World::getInstance().endAtomSelection()) {
    10188      STATUS("You have given a sphere radius "+toString(params.SphereRadius.get())
    10289          +" != 0, but have not select any atoms.");
    10390      return Action::failure;
    10491    }
    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;
    118113  FillRegularGridState *UndoState = NULL;
    119   bool successflag = false;
    120114  {
    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 
    139115    // 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        }
    180139    }
    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    }
    189155  }
    190156
Note: See TracChangeset for help on using the changeset viewer.