source: src/UIElements/CommandLineUI/CommandLineParser.hpp@ d5240d

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since d5240d was e4afb4, checked in by Frederik Heber <heber@…>, 14 years ago

Huge refactoring: Introduction of Traits to Actions.

This change is really big but the introduction of the Trait concept (at least
in its current light form) is so fundamental that lots of pieces had to be
changed in order to get everything working.

The main point why it was necessary to add these traits in the first place was
to comfortably allow for adding extension of Actions information-wise, i.e.
with stuff that is only important for the QtUI, such as icons, or tooltips, ...
This extra information should not be stored with Action itself, as it has
nothing to do with the workings of the Action. And neither should it get
stored with some blown-out-of-proportions MapOfActions class ...

The gist of the change is as follows:

  • OptionTrait contains the token, description, shortform and type of an option, such as ("position", "position in space, none, typeid(Vector)).
  • ActionTrait is the derived form for actions where additionally MenuPosition and MenuName are stored (and probably more to come for the GUI), also we have a set of OptionTrait instances, one for each option of the Action.
  • Action then contains this ActionTrait, specialized for each Action.
  • the preprocessor macros have been enhanced to gather all this information from the .def files.
  • MapOfActions is gone. Completely. Most of its use was to store this extra information and the ValueStorage part now is just in class ValueStorage.
  • ValueStorage is no more an interface to MapOfActions but as the name says a (type-safe) ValueStorage.

Listing the (remaining) changes in alphabetical order of the class:

  • Action
    • member value ::name dropped, ::getName() uses ActionTraits::getName()
    • new define NODEFAULT which is used in paramdefaults in .def files
    • all derived actions classes such as Process, Calculations, MakroAction,... have been adapated to use the ActionTrait concept as well.
  • ActionHistory
    • extraced RedoAction and UndoAction, shifted implementation into their own object files and they use .def files as well (i.e. streamlined with method used for other actions)
  • MenuDescription
    • contain information on Menus such as name, ...
    • new unit test checks for consistency
  • molecule
    • const member functions: Copy(), Output() and OutputBonds()
  • OptionRegistry
    • new registry class for options only
    • we want the same type throughout the code for each token, e.g. "position"
    • the registry containts checks for consistency
  • OptionTrait
    • default values are specified in paramdefaults, none are given by NODEFAULT
    • introduced default for translate-atoms, point-correlation, pair-correlation
  • Registry pattern
    • new unit test, but only sceleton code so far
  • ...Query, also ...Pipe
    • atoms, molecule and elements are now all const
    • also ValueStorage's signatures all have const therein
  • ValueStorage
    • set/queryCurrentValue from MapOfActions
    • at times VectorValue has been in .def files where Vector was in the signature. This is cleared. Such stuff is only present for e.g. BoxVector being queried as a Vector. But this is a feature and intended.
  • World
    • most of the (un)selection functions now work on const atoms and molecules
    • in one case we need a const_cast to remove this, but this is intentional, as the vector of selected atoms stores non-const pointers and this is ok.

There is only one test which had to be changed slightly because a specific
option token as "position" must now have the same type everywhere, e.g. always
Vector.

  • TESTFIX: Simple_configuration/2: --position -> --domain-position (and associated to BoxVector)
  • Property mode set to 100644
File size: 6.9 KB
Line 
1/*
2 * CommandLineParser.hpp
3 *
4 * Created on: May 8, 2010
5 * Author: heber
6 */
7
8#ifndef COMMANDLINEPARSER_HPP_
9#define COMMANDLINEPARSER_HPP_
10
11#include <boost/program_options.hpp>
12
13namespace po = boost::program_options;
14
15#include "Patterns/Singleton.hpp"
16#include "UIElements/CommandLineUI/TypeEnumContainer.hpp"
17
18#include <map>
19
20class Action;
21class OptionTrait;
22
23/** This class is a wrapper for boost::program_options.
24 *
25 * <h1> CommandLine Howto </h1>
26 * <h2> Introduction </h2>
27 *
28 * The UIFactory is a base class for the User Interaction. There are three UI specializations:
29 * Text, GUI and CommandLine. Accessing functionality via the CommandLine UI is explained here.
30 *
31 * First, an Action has to be written for the specific functionality. This Action should
32 * be added in Actions/...Action in the respective subdirectory of the following types:
33 * -# Analysis: Analysis actions like evaluating pair correlation, bonds, ...
34 * -# Atom: adding, removing, manipulating atoms
35 * -# Cmd: specifying data bases, verbosity, ...
36 * -# Fragmentation: fragmenting a system, performing graph analysis, ...
37 * -# Molecule: adding, removing, manipulating molecules
38 * -# Parser: Parsing files (loading, saving)
39 * -# Tesselation: obtaining (non)convex surface of a molecule, embedding, ...
40 * -# World: Setting Box dimensions, default name of new molecules, ...
41 *
42 * The CommandLineUIFactory is a specialization of the UIFactory for parsing command
43 * line parameters, generating and executing actions there from.
44 *
45 * The idea of the CommandLineFactory is explained elsewhere, here we would like to give a
46 * receipe for creating new actions.
47 *
48 * <h3>Introducing new actions</h3>
49 *
50 * Let us now introduce what to do if a new action is to be implemented. Here, we use the
51 * CommandLineVersionAction as an example.
52 * This consists if basically three parts:
53 * 1. Create the files, write the classes and make them compilable
54 * - Create new source and header files in one of the above subfolders in the Actions folder,
55 * e.g. create VersionAction.cpp and VersionAction.hpp in Actions/Cmd/
56 * - Give it a sensible class name, the convention is <type><what it does>Action,
57 * where <type> is basically the naming (written out) of the subdirectory,
58 * e.g. class CommandLineVersionAction.
59 * - Add the source and header file to the respective variables in molecuilder/src/Makefile.am,
60 * e.g. if you add a Cmd action the variables are CMDACTIONSOURCE and CMDACTIONHEADER,
61 * such that they get compiled.
62 * 2. Add an instance to the CommandLineUIFactory, such that they are known to the UI.
63 * - Add the header file as an include to UIElements/CommandLineWindow.cpp, e.g.
64 * #include "Actions/Cmd/VersionAction.hpp"
65 * - Add an instance of your class to the specific populater-function in
66 * UIElements/CommandLineWindow.cpp, e.g. for the above Cmd action, add to populateCommandActions()
67 * add new CommandLineVersionAction().
68 * This will automatically register in the ActionRegistry.
69 * 3. Give them an option name, short hand an description, such that they can be referenced from
70 * the command line.
71 * - think of a new key name, e.g. "version", which is the long form of the command parameter,
72 * i.e. --version).
73 * - add this key to every map of MapofActions, i.e. to
74 * - MapofActions::DescriptionMap: the description which appears as help and tooltip
75 * - MapofActions::ShortFormMap: the short form of the command parameter (e.g. -v)
76 * - MapofActions::ValueMap: the value the command parameter has (do not create if it does not need one)
77 * - If your action requires additional parameters, these need to be added in the same manner as in
78 * the list item above.
79 *
80 * Don't forget to write the actual code. :)
81 *
82 * <h3>Writing an action</h3>
83 *
84 * As you write a new action you may think in terms of the command line, i.e. you want to use this
85 * new functionality you add by calling molecuilder as: ./molecuilder --super-action foobar.txt, where
86 * the key of your new action would be "super-action". While this is fine, keep in mind, that your action
87 * should be useable for the other UI specializations as well, i.e. from the menu and the GUI. Therefore,
88 * -# Don't use cin to ask the user for input: Use Query...()!
89 * -# Rather don't use cout/cerrs, but either give Log() or eLog() or use QueryEmpty() if you want to give
90 * the user specific information what you ask of him.
91 *
92 */
93class CommandLineParser : public Singleton<CommandLineParser> {
94 friend class Singleton<CommandLineParser>;
95public:
96
97 // Parses the command line arguments in CommandLineParser::**argv with currently known options.
98 void Run(int _argc, char **_argv);
99
100 // Initialises all options from ActionRegistry.
101 void InitializeCommandArguments();
102
103 // Checks whether there have been any commands on the command line.
104 bool isEmpty();
105
106 /* boost's program_options are sorted into three categories:
107 * -# generic options: option available to both command line and config
108 * -# config options: only available in the config file
109 * -# hidden options: options which the user is not shown on "help"
110 */
111 po::options_description analysis;
112 po::options_description atom;
113 po::options_description command;
114 po::options_description edit;
115 po::options_description fragmentation;
116 po::options_description molecule;
117 po::options_description parser;
118 po::options_description selection;
119 po::options_description tesselation;
120 po::options_description world;
121 po::options_description options;
122
123 po::options_description visible;
124
125 po::variables_map vm;
126
127 // private sequence of actions as they appeared on the command line
128 std::list<std::string> SequenceOfActions;
129
130private:
131 // private constructor and destructor
132 CommandLineParser();
133 virtual ~CommandLineParser();
134
135 /* The following program_options options_decriptions are used to
136 * generate the various cases and call differently in Parse().
137 */
138 po::options_description cmdline_options;
139 po::options_description config_file_options;
140
141 // adds options to the parser
142 void AddOptionToParser(const OptionTrait * const currentOption, po::options_description* OptionList);
143
144 // creates a map from short forms to action tokens needed to parse command line
145 std::map <std::string, std::string> getShortFormToActionMap();
146
147 // lookup list from "configmenus" to the ones of CommandLineParser
148 std::map< std::string , po::options_description *> CmdParserLookup;
149
150 // Sets the options from the three cases.
151 void setOptions(int _argc, char **_argv);
152
153 // Parses all options from command line and config file
154 void Parse();
155
156 // as boost's program_options does not care about of order of appearance but we do for actions,
157 // we have to have a list and a function to obtain it.
158 void scanforSequenceOfArguments();
159
160 TypeEnumContainer TypeToEnums;
161
162 // argument counter and array passed on from main()
163 int argc;
164 char **argv;
165};
166
167#endif /* COMMANDLINEPARSER_HPP_ */
Note: See TracBrowser for help on using the repository browser.