00001 /* 00002 Autor: $Author: kunkel $ State: $State: Exp $ 00003 Datum: $Date: 2005/05/30 12:35:25 $ 00004 Version: $Revision: 1.1 $ 00005 */ 00006 00011 #include "Integrator.h" 00012 #include "RungeKutta.h" 00013 #include "RungeKuttaAdaptive.h" 00014 #include "Window.h" 00015 #include "Message.h" 00016 00017 00018 Integrator::classWindowEditAttributes * Integrator::editAttributes=0; 00019 00020 // max Anzahl möglicher Integratoren 00021 #define INTEGRATORS 2 00022 00023 // int- und char-Name der Integratoren 00024 char integratorName[INTEGRATORS][20] = {"RungeKutta","RungeKuttaAdaptive"} ; 00025 00029 void Integrator::Error::print() { 00030 Message::msg(Message::ERROR, message); 00031 } 00032 00038 Integrator * Integrator::createIntegrator(const string & name) { 00039 Integrator * integrator; 00040 if(name == "RungeKutta") 00041 integrator = new RungeKutta; 00042 else if(name == "RungeKuttaAdaptive") 00043 integrator = new RungeKuttaAdaptive; 00044 else 00045 // verwende RungeKutta, falls name unbekannt 00046 integrator = new RungeKutta; 00047 00048 editAttributes = 0; 00049 return integrator; 00050 } 00051 00052 00056 int Integrator::getTypeCount() { 00057 return INTEGRATORS; 00058 } 00059 00065 int Integrator::TypeToInt(const string & intType) { 00066 for(int i=0; i < INTEGRATORS; i++) 00067 if(intType == integratorName[i]) 00068 return i; 00069 cerr << "Unknown Integrator detected (Integrator): " << intType << endl; 00070 return 0; 00071 } 00072 00078 char * Integrator::NumToType(const int typenum) { 00079 if(typenum < INTEGRATORS) 00080 return integratorName[typenum]; 00081 00082 cerr << "Unknown Integrator detected (Integrator): " << typenum << endl; 00083 return integratorName[0]; 00084 } 00085 00086 00090 void Integrator::closeAttributeWindow() { 00091 if(editAttributes == 0) 00092 return; 00093 editAttributes->attributeWindow->close(); 00094 if(editAttributes->additionalInformation != 0) 00095 editAttributes->my->deleteAdditionalInformation 00096 (editAttributes->additionalInformation); 00097 delete(editAttributes); 00098 editAttributes = 0; 00099 } 00100 00104 void Integrator::createBasisAttributeWindow() { 00105 00106 // tue nichts, wenn AttributeWindow fuer diesen Integrator bereits existiert 00107 if(editAttributes != 0 && editAttributes->my == this ) 00108 return; 00109 00110 // schliesse AttributeWindow (eines anderen Integrators), falls es existiert 00111 closeAttributeWindow(); 00112 editAttributes = new classWindowEditAttributes; 00113 editAttributes->attributeWindow = GLUI_Master.create_glui("Attributes"); 00114 editAttributes->my = this; 00115 editAttributes->additionalInformation = 0; 00116 GLUI * aw= editAttributes->attributeWindow; 00117 GLUI_Update_CB mc = (GLUI_Update_CB) Integrator::AttributeMenuCallback; 00118 00119 // erzeuge Buttons 00120 GLUI_Button *b= aw->add_button( "Set",OK, mc ); 00121 b->set_w(100); 00122 b=aw->add_button( "Close",CANCEL, mc ); 00123 b->set_w(100); 00124 aw->add_separator(); 00125 aw->set_main_gfx_window(Window::getMainWindow()); 00126 } 00127 00132 void Integrator::AttributeMenuCallback(int b) { 00133 if(Integrator::editAttributes == 0) 00134 cerr << "FEHLER Integrator::editAttributes uninitialisiert"; 00135 switch(b) { 00136 case(OK): { 00137 // geaenderte Eigenschaft wird uebernommen 00138 editAttributes->my->saveAttributes(); 00139 break; 00140 } 00141 case (CANCEL): { 00142 // AttributeWindow wird geschlossen ohne evtl. Aenderungen zu 00143 // uebernehmen 00144 closeAttributeWindow(); 00145 break; 00146 } 00147 default: 00148 cerr << "UNKNOWN KEY PRESSED " << b << " AttributeMenuCallback" << endl; 00149 } 00150 } 00151 00152 00153