source: src/UIElements/TextUI/TextDialog.cpp@ 980dd6

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 980dd6 was 104524, checked in by Frederik Heber <heber@…>, 15 years ago

Changed PairCorrelationAction to incorporate all three cases and handled different parameters needed for each, changed queryElement to list of elements.

PairCorrelationAction:

queryElement:

Others:

  • Property mode set to 100644
File size: 9.5 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, std::vector<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, std::vector<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 element * tmp = NULL;
294 do{
295 badInput = false;
296 Log() << Verbose(0) << getTitle();
297
298 // try to read as Atomic number
299 int Z;
300 cin >> Z;
301 if(!cin.fail()){
302 if(Z==-1){
303 aborted = true;
304 }
305 else{
306 tmp = World::getInstance().getPeriode()->FindElement(Z);
307 if(!tmp){
308 Log() << Verbose(0) << "No element with this atomic number!" << endl;
309 badInput = true;
310 } else {
311 elements.push_back(tmp);
312 }
313 }
314 continue;
315 }
316 else{
317 cin.clear();
318 }
319
320 // Try to read as shorthand
321 // the last buffer content was not removed, so we read the
322 // same thing again, this time as a string
323 string shorthand;
324 cin >> shorthand;
325 if(!cin.fail()){
326 if(shorthand.empty()){
327 aborted = true;
328 }
329 else{
330 tmp = World::getInstance().getPeriode()->FindElement(shorthand.c_str());
331 if(!tmp){
332 Log() << Verbose(0) << "No element with this shorthand!" << endl;
333 badInput = true;
334 } else {
335 elements.push_back(tmp);
336 }
337 }
338 }
339 else{
340 Log() << Verbose(0) << "Could not read input. Try Again." << endl;
341 cin.clear();
342 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
343 badInput = true;
344 }
345
346 }while(badInput);
347 cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
348 return !aborted;
349}
Note: See TracBrowser for help on using the repository browser.