source: src/UIElements/TextUI/TextDialog.cpp@ c78d44

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 c78d44 was 5079a0, checked in by Frederik Heber <heber@…>, 15 years ago

Actions put into libMolecuilderActions, UIElements into libMolecuilderUI

  • due to great number of Actions it is sensible to put them into their own library
  • this is advantageous overall, but right now especially as all the unit tests do not depend on this lib.
  • it was also needed as Actions depend on UIElements and to resolve to correct ordering, UIElements have to be available before the libMolecuilderActions is aded (if compiled into libmolecuilder it is appended after!)
  • Property mode set to 100644
File size: 9.4 KB
Line 
1/*
2 * TextDialog.cpp
3 *
4 * Created on: Jan 5, 2010
5 * Author: crueger
6 */
7
8#include <iostream>
9
10#include <Descriptors/AtomDescriptor.hpp>
11#include <Descriptors/AtomIdDescriptor.hpp>
12#include <Descriptors/MoleculeDescriptor.hpp>
13#include <Descriptors/MoleculeIdDescriptor.hpp>
14#include "TextUI/TextDialog.hpp"
15
16#include "World.hpp"
17#include "periodentafel.hpp"
18#include "log.hpp"
19#include "verbose.hpp"
20
21#include "atom.hpp"
22#include "element.hpp"
23#include "molecule.hpp"
24#include "vector.hpp"
25
26using namespace std;
27
28
29TextDialog::TextDialog()
30{
31}
32
33TextDialog::~TextDialog()
34{
35}
36
37
38void TextDialog::queryEmpty(const char* title, string description){
39 registerQuery(new EmptyTextQuery(title,description));
40}
41
42void TextDialog::queryBoolean(const char* title, bool* target, string description){
43 registerQuery(new BooleanTextQuery(title,target,description));
44}
45
46void TextDialog::queryInt(const char* title, int* target, string description){
47 registerQuery(new IntTextQuery(title,target,description));
48}
49
50void TextDialog::queryDouble(const char* title, double* target, string description){
51 registerQuery(new DoubleTextQuery(title,target,description));
52}
53
54void TextDialog::queryString(const char* title, string* target, string description){
55 registerQuery(new StringTextQuery(title,target,description));
56}
57
58void TextDialog::queryAtom(const char* title, atom **target, string description) {
59 registerQuery(new AtomTextQuery(title,target,description));
60}
61
62void TextDialog::queryMolecule(const char* title, molecule **target, string description) {
63 registerQuery(new MoleculeTextQuery(title,target,description));
64}
65
66void TextDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check, string description) {
67 registerQuery(new VectorTextQuery(title,target,cellSize,check,description));
68}
69
70void TextDialog::queryBox(const char* title,double ** const cellSize, string description) {
71 registerQuery(new BoxTextQuery(title,cellSize,description));
72}
73
74void TextDialog::queryElement(const char* title, const element **target, string description){
75 registerQuery(new ElementTextQuery(title,target,description));
76}
77
78/************************** Query Infrastructure ************************/
79
80TextDialog::EmptyTextQuery::EmptyTextQuery(string title, std::string _description) :
81 Dialog::EmptyQuery(title,_description)
82{}
83
84TextDialog::EmptyTextQuery::~EmptyTextQuery() {}
85
86bool TextDialog::EmptyTextQuery::handle() {
87 cout << "Message of " << getTitle() << ":\n" << getDescription() << "\n";
88 return true;
89}
90
91TextDialog::IntTextQuery::IntTextQuery(string title, int * _target, std::string _description) :
92 Dialog::IntQuery(title,_target,_description)
93{}
94
95TextDialog::IntTextQuery::~IntTextQuery() {}
96
97bool TextDialog::IntTextQuery::handle() {
98 bool badInput = false;
99 do{
100 badInput = false;
101 Log() << Verbose(0) << getTitle();
102 cin >> tmp;
103 if(cin.fail()){
104 badInput=true;
105 cin.clear();
106 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
107 Log() << Verbose(0) << "Input was not a number!" << endl;
108 }
109 } while(badInput);
110 // clear the input buffer of anything still in the line
111 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
112 return true;
113}
114
115TextDialog::BooleanTextQuery::BooleanTextQuery(string title, bool * _target, std::string _description) :
116 Dialog::BooleanQuery(title,_target,_description)
117{}
118
119TextDialog::BooleanTextQuery::~BooleanTextQuery() {}
120
121bool TextDialog::BooleanTextQuery::handle() {
122 bool badInput = false;
123 char input = ' ';
124 do{
125 badInput = false;
126 Log() << Verbose(0) << getTitle();
127 cin >> input;
128 if ((input == 'y' ) || (input == 'Y')) {
129 tmp = true;
130 } else if ((input == 'n' ) || (input == 'N')) {
131 tmp = false;
132 } else {
133 badInput=true;
134 cin.clear();
135 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
136 Log() << Verbose(0) << "Input was not of [yYnN]!" << endl;
137 }
138 } while(badInput);
139 // clear the input buffer of anything still in the line
140 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
141 return true;
142}
143
144TextDialog::StringTextQuery::StringTextQuery(string title,string *_target, std::string _description) :
145 Dialog::StringQuery(title,_target,_description)
146{}
147
148TextDialog::StringTextQuery::~StringTextQuery() {}
149
150bool TextDialog::StringTextQuery::handle() {
151 Log() << Verbose(0) << getTitle();
152 getline(cin,tmp);
153 return true;
154}
155
156TextDialog::DoubleTextQuery::DoubleTextQuery(string title,double *_target, std::string _description) :
157 Dialog::DoubleQuery(title,_target,_description)
158{}
159
160TextDialog::DoubleTextQuery::~DoubleTextQuery() {}
161
162bool TextDialog::DoubleTextQuery::handle() {
163 bool badInput = false;
164 do{
165 badInput = false;
166 Log() << Verbose(0) << getTitle();
167 cin >> tmp;
168 if(cin.fail()){
169 badInput = true;
170 cin.clear();
171 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
172 Log() << Verbose(0) << "Input was not a number!" << endl;
173 }
174 }while(badInput);
175 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
176 return true;
177}
178
179TextDialog::AtomTextQuery::AtomTextQuery(string title, atom **_target, std::string _description) :
180 Dialog::AtomQuery(title,_target,_description)
181{}
182
183TextDialog::AtomTextQuery::~AtomTextQuery() {}
184
185bool TextDialog::AtomTextQuery::handle() {
186 int idxOfAtom=0;
187 bool badInput = false;
188 do{
189 badInput = false;
190 Log() << Verbose(0) << getTitle();
191 cin >> idxOfAtom;
192 if(cin.fail()){
193 badInput = true;
194 cin.clear();
195 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
196 Log() << Verbose(0) << "Input was not a number!" << endl;
197 continue;
198 }
199
200 tmp = World::getInstance().getAtom(AtomById(idxOfAtom));
201 if(!tmp && idxOfAtom!=-1){
202 Log() << Verbose(0) << "Invalid Atom Index" << endl;
203 badInput = true;
204 }
205
206 } while(badInput);
207 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
208 return (idxOfAtom!=-1);
209}
210
211TextDialog::MoleculeTextQuery::MoleculeTextQuery(string title, molecule **_target, std::string _description) :
212 Dialog::MoleculeQuery(title,_target,_description)
213{}
214
215TextDialog::MoleculeTextQuery::~MoleculeTextQuery() {}
216
217bool TextDialog::MoleculeTextQuery::handle() {
218 int idxOfMol=0;
219 bool badInput = false;
220 do{
221 badInput = false;
222 Log() << Verbose(0) << getTitle();
223 cin >> idxOfMol;
224 if(cin.fail()){
225 badInput = true;
226 cin.clear();
227 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
228 Log() << Verbose(0) << "Input was not a number!" << endl;
229 continue;
230 }
231
232 tmp = World::getInstance().getMolecule(MoleculeById(idxOfMol));
233 if(!tmp && idxOfMol!=-1){
234 Log() << Verbose(0) << "Invalid Molecule Index" << endl;
235 badInput = true;
236 }
237
238 } while(badInput);
239 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
240 return (idxOfMol!=-1);
241}
242
243TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, const double *const _cellSize, bool _check, std::string _description) :
244 Dialog::VectorQuery(title,_target,_cellSize,_check,_description)
245{}
246
247TextDialog::VectorTextQuery::~VectorTextQuery()
248{}
249
250bool TextDialog::VectorTextQuery::handle() {
251 Log() << Verbose(0) << getTitle();
252
253 char coords[3] = {'x','y','z'};
254 int j = -1;
255 for (int i=0;i<3;i++) {
256 j += i+1;
257 do {
258 Log() << Verbose(0) << coords[i] << "[0.." << cellSize[j] << "]: ";
259 cin >> (*tmp)[i];
260 } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= cellSize[j])) && (check));
261 }
262 return true;
263}
264
265TextDialog::BoxTextQuery::BoxTextQuery(std::string title, double ** const _cellSize, std::string _description) :
266 Dialog::BoxQuery(title,_cellSize,_description)
267{}
268
269TextDialog::BoxTextQuery::~BoxTextQuery()
270{}
271
272bool TextDialog::BoxTextQuery::handle() {
273 Log() << Verbose(0) << getTitle();
274
275 std::string coords[6] = {"xx","xy","xz", "yy", "yz", "zz"};
276 for (int i=0;i<6;i++) {
277 Log() << Verbose(0) << coords[i] << ": ";
278 cin >> tmp[i];
279 }
280 return true;
281}
282
283TextDialog::ElementTextQuery::ElementTextQuery(std::string title, const element **target, std::string _description) :
284 Dialog::ElementQuery(title,target,_description)
285{}
286
287TextDialog::ElementTextQuery::~ElementTextQuery()
288{}
289
290bool TextDialog::ElementTextQuery::handle() {
291 bool badInput=false;
292 bool aborted = false;
293 do{
294 badInput = false;
295 Log() << Verbose(0) << getTitle();
296
297 // try to read as Atomic number
298 int Z;
299 cin >> Z;
300 if(!cin.fail()){
301 if(Z==-1){
302 aborted = true;
303 }
304 else{
305 tmp = World::getInstance().getPeriode()->FindElement(Z);
306 if(!tmp){
307 Log() << Verbose(0) << "No element with this atomic number!" << endl;
308 badInput = true;
309 }
310 }
311 continue;
312 }
313 else{
314 cin.clear();
315 }
316
317 // Try to read as shorthand
318 // the last buffer content was not removed, so we read the
319 // same thing again, this time as a string
320 string shorthand;
321 cin >> shorthand;
322 if(!cin.fail()){
323 if(shorthand.empty()){
324 aborted = true;
325 }
326 else{
327 tmp = World::getInstance().getPeriode()->FindElement(shorthand.c_str());
328 if(!tmp){
329 Log() << Verbose(0) << "No element with this shorthand!" << endl;
330 badInput = true;
331 }
332 }
333 }
334 else{
335 Log() << Verbose(0) << "Could not read input. Try Again." << endl;
336 cin.clear();
337 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
338 badInput = true;
339 }
340
341 }while(badInput);
342 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
343 return !aborted;
344}
Note: See TracBrowser for help on using the repository browser.