/*
 * FillSurfaceAction.def
 *
 *  Created on: Mar 29, 2012
 *      Author: heber, bollerhe
 */

// all includes and forward declarations necessary for non-integral types below
#include <vector>
#include "Atom/AtomicInfo.hpp"
#include "Bond/BondInfo.hpp"
#include "types.hpp"

#include "Parameters/Validators/DummyValidator.hpp"
#include "Parameters/Validators/Specific/BoxLengthValidator.hpp"
#include "Parameters/Validators/Specific/BoxVectorValidator.hpp"
#include "Parameters/Validators/Specific/VectorNotZeroValidator.hpp"

// i.e. there is an integer with variable name Z that can be found in
// ValueStorage by the token "Z" -> first column: int, Z, "Z"
// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
#define paramtypes (unsigned int)(double)(double)(double)(double)(Vector)
#define paramtokens ("count")("min-distance")("tesselation-radius")("random-atom-displacement")("random-molecule-displacement")("Alignment-Axis")
#define paramdescriptions ("number of instances to be added, changed according to geometric needs")("minimum distance between added instances")("radius of rolling sphere in tesselating selected molecule's surfaces")("magnitude of random atom displacement")("magnitude of random molecule displacement")("The filler molecule is rotated relative to this alignment axis")
#define paramdefaults (PARAM_DEFAULT(12))(PARAM_DEFAULT(1.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(0.))(NOPARAM_DEFAULT)
#define paramreferences (N)(mindistance)(SphereRadius)(RandAtomDisplacement)(RandMoleculeDisplacement)(AlignedAxis)
#define paramvalids \
(DummyValidator< unsigned int >()) \
(BoxLengthValidator()) \
(BoxLengthValidator()) \
(BoxLengthValidator()) \
(BoxLengthValidator()) \
(VectorNotZeroValidator())

#define statetypes (std::vector<AtomicInfo>)(std::vector<BondInfo>)(std::vector<AtomicInfo>)(std::vector<Vector>)
#define statereferences (clonedatoms)(clonedbonds)(movedatoms)(MovedToVector)

// some defines for all the names, you may use ACTION, STATE and PARAMS
#define CATEGORY Fill
#define MENUNAME "fill"
#define MENUPOSITION 2
#define ACTIONNAME Surface
#define TOKEN "fill-surface"


// finally the information stored in the ActionTrait specialization
#define DESCRIPTION "\
fill homogenous points on a shape's surface with instances of the selected molecule."
#undef SHORTFORM
