Ignore:
File:
1 edited

Legend:

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

    rcae614 r26b4d62  
    4444#include "Filling/Cluster.hpp"
    4545#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"
    4754#include "molecule.hpp"
    4855#include "MoleculeListClass.hpp"
    4956#include "Parser/FormatParserInterface.hpp"
    5057#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"
    5163#include "World.hpp"
     64
    5265
    5366#include <algorithm>
     
    7992  LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms.");
    8093
    81   // center filler's tip at origin
    82   filler->CenterEdge();
    83 
    84   // prepare the filler preparator
    85   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;
    8699  if (params.SphereRadius.get() != 0.) {
    87     if (World::getInstance().beginAtomSelection() == World::getInstance().endAtomSelection()) {
     100    if ( atoms.size() == 0) {
    88101      STATUS("You have given a sphere radius "+toString(params.SphereRadius.get())
    89102          +" != 0, but have not select any atoms.");
    90103      return Action::failure;
    91104    }
    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;
    112119  bool successflag = false;
    113   FillRegularGridState *UndoState = NULL;
    114120  {
     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
    115139    // 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      }
    139180    }
    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;
    155189  }
    156190
Note: See TracChangeset for help on using the changeset viewer.