Ignore:
File:
1 edited

Legend:

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

    rdf9f20 r26b4d62  
    4646#include "Filling/Mesh/MeshAdaptor.hpp"
    4747#include "Filling/Predicates/IsVoidNode_FillPredicate.hpp"
    48 #include "Filling/Preparators/ShapeSurfaceFillerPreparator.hpp"
    4948#include "molecule.hpp"
    5049#include "Shapes/BaseShapes.hpp"
    5150#include "Shapes/ShapeRegistry.hpp"
    52 #include "Shapes/ShapeType.hpp"
    5351#include "World.hpp"
    5452
     
    8381
    8482  // center filler's tip at origin
    85   filler->CenterEdge();
     83  Vector max;
     84  filler->CenterEdge(&max);
    8685
    8786  // determine center with respect to alignment axis
     
    9796  {
    9897    Vector translater = -1.*sum;
    99     filler->Translate(translater);
    100   }
    101 
    102   // prepare the filler preparator
    103   if (ShapeRegistry::getInstance().countSelectedShapes() != (size_t)1) {
    104     STATUS("Not exactly one shape selected.");
    105     return Action::failure;
    106   }
    107   const std::vector<Shape*> shapes = ShapeRegistry::getInstance().getSelectedShapes();
    108   const Shape &shape = **shapes.begin();
    109 
    110   // hard check whether shape is of allowed type, not all are implemented
    111   // but these only fail with an assertion, hence not with disable-debug
    112   switch (shape.getType()) {
    113     case NowhereType:
    114     case EverywhereType:
    115       STATUS("The shape type "+toString(shape.getType())+" is currently not supported.");
    116       return Action::failure;
    117       break;
    118     default:
    119       break;
    120   }
    121 
    122   ShapeSurfaceFillerPreparator filler_preparator(filler);
    123   if (params.SphereRadius.get() != 0.) {
    124     if (World::getInstance().beginAtomSelection() == World::getInstance().endAtomSelection()) {
    125       STATUS("You have given a sphere radius "+toString(params.SphereRadius.get())
    126           +" != 0, but have not select any atoms.");
     98    filler->Translate(&translater);
     99  }
     100
     101  // create predicate, mesh, and filler
     102  FillSurfaceState *UndoState = NULL;
     103  bool successflag = false;
     104  {
     105    FillPredicate *voidnode_predicate = new FillPredicate(
     106        IsVoidNode_FillPredicate(
     107            Sphere(zeroVec, params.mindistance.get())
     108            )
     109        );
     110
     111
     112    std::vector<Shape*> selectedShapes = ShapeRegistry::getInstance().getSelectedShapes();
     113    if (selectedShapes.size() != 1){
     114      STATUS("There has to be exactly 1 selected shape.");
    127115      return Action::failure;
    128116    }
    129     std::vector<atom*> atoms(World::getInstance().getSelectedAtoms());
    130     filler_preparator.addSurfacePredicate(
    131         params.SphereRadius.get(),
    132         atoms);
    133   }
    134   filler_preparator.addVoidPredicate(params.mindistance.get());
    135   filler_preparator.addSurfaceRandomInserter(
    136       shape,
    137       params.AlignedAxis.get(),
    138       params.RandAtomDisplacement.get(),
    139       params.RandMoleculeDisplacement.get());
    140   filler_preparator.addShapeMesh(
    141       shape,
    142       params.N.get());
    143   if (!filler_preparator()) {
    144     STATUS("Filler was not fully constructed.");
    145     return Action::failure;
    146   }
    147 
    148   // use filler
    149   bool successflag = false;
    150   FillSurfaceState *UndoState = NULL;
    151   {
     117
     118    boost::function<const NodeSet ()> func =
     119        boost::bind(&Shape::getHomogeneousPointsOnSurface, boost::ref(*selectedShapes[0]), params.N.get());
     120    Mesh *mesh = new MeshAdaptor(func);
     121    Inserter *inserter = new Inserter(
     122        Inserter::impl_ptr(new SurfaceInserter(*selectedShapes[0], params.AlignedAxis.get())));
     123
    152124    // fill
    153125    {
    154       Filler *fillerFunction = filler_preparator.obtainFiller();
     126      Filler *fillerFunction = new Filler(*mesh, *voidnode_predicate, *inserter);
    155127      ClusterInterface::Cluster_impl cluster( new Cluster( filler->getAtomIds(), filler->getBoundingSphere() ) );
    156128      CopyAtoms_withBonds copyMethod;
     
    189161      }
    190162    }
     163
     164    // remove
     165    delete mesh;
     166    delete inserter;
     167    delete voidnode_predicate;
    191168  }
    192169
Note: See TracChangeset for help on using the changeset viewer.