TAPs 0.7.7.3
TAPsWXHETriMeshOneModelMultiPartsParameters.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsWXHETriMeshOneModelMultiPartsParameters.cpp
00003 ******************************************************************************/
00007 /******************************************************************************
00008 SUKITTI PUNAK   (10/02/2009)
00009 UPDATE          (09/03/2010)
00010 ******************************************************************************/
00011 #include "TAPsWXHETriMeshOneModelMultiPartsParameters.hpp"
00012 // Using Inclusion Model (i.e. definitions are included in declarations)
00013 //                       (this name.cpp is included in name.hpp)
00014 // Each friend is defined directly inside its declaration.
00015 
00016 BEGIN_NAMESPACE_TAPs__WX
00017 //=============================================================================
00018 // EVENT TABLE
00019 //-----------------------------------------------------------------------------
00020 IMPLEMENT_CLASS ( WXHETriMeshOneModelMultiPartsParameters, wxDialog )
00021 //-----------------------------------------------------------------------------
00022 BEGIN_EVENT_TABLE( WXHETriMeshOneModelMultiPartsParameters, wxDialog )
00023 
00024     EVT_TEXT        ( ID_WXHeTmOmMp_Type,                   WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00025     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_Type,                   WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00026     EVT_TEXT        ( ID_WXHeTmOmMp_Name_TextCtrl,          WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00027     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_Name_TextCtrl,          WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00028     EVT_TEXT        ( ID_WXHeTmOmMp_Name_Button,            WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00029     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_Name_Button,            WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00030     EVT_TEXT        ( ID_WXHeTmOmMp_TrxTranslationX,                    WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00031     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxTranslationX,                    WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00032     EVT_TEXT        ( ID_WXHeTmOmMp_TrxTranslationY,                    WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00033     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxTranslationY,                    WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00034     EVT_TEXT        ( ID_WXHeTmOmMp_TrxTranslationZ,                    WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00035     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxTranslationZ,                    WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00036     EVT_TEXT        ( ID_WXHeTmOmMp_TrxRotationAxisX,                   WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00037     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxRotationAxisX,                   WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00038     EVT_TEXT        ( ID_WXHeTmOmMp_TrxRotationAxisY,                   WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00039     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxRotationAxisY,                   WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00040     EVT_TEXT        ( ID_WXHeTmOmMp_TrxRotationAxisZ,                   WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00041     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxRotationAxisZ,                   WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00042     EVT_TEXT        ( ID_WXHeTmOmMp_TrxRotationAngle,                   WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00043     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxRotationAngle,                   WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00044     EVT_TEXT        ( ID_WXHeTmOmMp_TrxScaleX,                  WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00045     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxScaleX,                  WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00046     EVT_TEXT        ( ID_WXHeTmOmMp_TrxScaleY,                  WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00047     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxScaleY,                  WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00048     EVT_TEXT        ( ID_WXHeTmOmMp_TrxScaleZ,                  WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00049     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_TrxScaleZ,                  WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00050     EVT_TEXT        ( ID_WXHeTmOmMp_MassTotal,                  WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00051     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_MassTotal,                  WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00052     EVT_TEXT        ( ID_WXHeTmOmMp_MassPt,                 WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00053     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_MassPt,                 WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00054     EVT_TEXT        ( ID_WXHeTmOmMp_SpringStiffness,                    WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00055     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_SpringStiffness,                    WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00056     EVT_TEXT        ( ID_WXHeTmOmMp_SpringDamper,                   WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00057     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_SpringDamper,                   WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00058     EVT_TEXT        ( ID_WXHeTmOmMp_HomeSpringStiffness,                    WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00059     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_HomeSpringStiffness,                    WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00060     EVT_TEXT        ( ID_WXHeTmOmMp_HomeSpringDamper,                   WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00061     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_HomeSpringDamper,                   WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00062     EVT_TEXT        ( ID_WXHeTmOmMp_SimTimeStep,                    WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00063     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_SimTimeStep,                    WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00064     EVT_TEXT        ( ID_WXHeTmOmMp_NumOfSimIterations,                 WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00065     EVT_TEXT_ENTER  ( ID_WXHeTmOmMp_NumOfSimIterations,                 WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters )
00066 
00067     EVT_CHECKBOX    ( ID_WXHeTmOmMp_TrxEnable,              WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00068     EVT_CHECKBOX    ( ID_WXHeTmOmMp_SimEnableSimulation,    WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00069     EVT_CHECKBOX    ( ID_WXHeTmOmMp_SimEnableCollision,     WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00070     EVT_CHECKBOX    ( ID_WXHeTmOmMp_SimEnableRendering,     WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters )
00071 
00072     //-----------------------------------------------------
00073 END_EVENT_TABLE()
00074 //=============================================================================
00075 
00076 //=============================================================================
00077 bool WXHETriMeshOneModelMultiPartsParameters::g_isInitialized   = false;
00078 wxColour    WXHETriMeshOneModelMultiPartsParameters::color_textEdit( 255, 0, 0 );
00079 wxColour    WXHETriMeshOneModelMultiPartsParameters::color_textNormal( 0, 0, 0 );
00080 wxColour    WXHETriMeshOneModelMultiPartsParameters::color_textWarning( 255, 0, 0 );
00081 //-----------------------------------------------------------------------------
00082 
00083 // Constructor
00084 WXHETriMeshOneModelMultiPartsParameters::WXHETriMeshOneModelMultiPartsParameters (
00085     void *  pParts      
00086 )
00087     : m_isLoaded( false ), m_pParts( pParts )
00088 {
00089     // Check initialization
00090     if ( !g_isInitialized ) {
00091         wxXmlResource::Get()->InitAllHandlers();// Shoud be initialized in the main program
00092         std::string xrcFile( Global::GetTAPsResourcePath() + std::string("wxWidgets/Dialogs/TAPsWXHETriMeshOneModelMultiPartsParameters.xrc") );
00093         if ( wxXmlResource::Get()->Load( xrcFile ) ) {
00094             g_isInitialized = true;
00095         }
00096         else {
00097             std::cout << "Loading xrcFile: " << xrcFile << " FAILED!\n";
00098             g_isInitialized = false;
00099         }
00100         {
00101             std::string xrcFile( Global::GetTAPsResourcePath() + std::string("wxWidgets/Dialogs/TAPsWXHETriMeshOneModelMultiParts_PartProperties_Panel.xrc") );
00102             if ( wxXmlResource::Get()->Load( xrcFile ) ) {
00103                 //g_isInitialized = true;
00104             }
00105             else {
00106                 std::cout << "Loading xrcFile: " << xrcFile << " FAILED!\n";
00107                 //g_isInitialized = false;
00108             }
00109         }
00110     }
00111 }
00112 
00113 
00114 // Destructor
00115 WXHETriMeshOneModelMultiPartsParameters::~WXHETriMeshOneModelMultiPartsParameters ()
00116 {}
00117 
00118 
00119 // Load the property dialog
00120 template <typename T>
00121 void WXHETriMeshOneModelMultiPartsParameters::PropertyDialog (
00122     wxWindow * parent,  
00123     TransformationSupport<T> * pTrxSupport, 
00124     std::vector< SimPropForMultiPartMeshModel_HalfEdge<T> > * pListOfParts  
00125 )
00126 {
00127     #ifdef  TAPs_USE_CUDA
00128     //m_bUseCUDA_PLHM = bUseCUDA_PLHM;
00129     #endif//TAPs_USE_CUDA
00130 
00131     // Load the dialog if not loaded yet
00132     if ( !m_isLoaded ) {
00133         wxXmlResource::Get()->LoadDialog( this, parent, "ID_WXHETriMeshOneModelMultiPartsProperties_Dialog" );
00134         if ( this->GetName().Matches( "ID_WXHETriMeshOneModelMultiPartsProperties_Dialog" ) ) {
00135             m_isLoaded = true;
00136             m_pTrxSupport = pTrxSupport;        // set link to the object's parameters
00137             m_pParts = pListOfParts;        // set link to the object's parameters
00138             m_pDataTypeInfo = &typeid(T);   // set link to data type, e.g. float or double
00139             SetIDs();                       // set IDs of all GUI elements
00140             if ( m_bAllIDsWorking ) {
00141 
00142                 for ( unsigned int i = 1; i <= pListOfParts->size(); ++i ) {
00143                     std::stringstream ss;
00144                     ss << "Part" << i;
00145                     wxPanel * page = new wxPanel( this );
00146                     wxXmlResource::Get()->LoadPanel( page, m_pID_WXHeTmOmMp_PartProp_Notebook, "ID_WXHETriMeshOneModelMultiParts_PartProperties_Panel" );
00147                     m_pID_WXHeTmOmMp_PartProp_Notebook->AddPage( page, ss.str() );
00148                     SetIDs_PartProps( page );
00149                 }
00150                 
00151                 InitControlLooks();             // initialize the looks of GUI controls
00152             }
00153         }
00154     }
00155 
00156     // Show the property dialog
00157     if ( m_isLoaded && m_bAllIDsWorking ) 
00158     {
00159         // Another way to connect the event handler, instead of declaring an event table
00160         //this->Connect( wxID_ANY, wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( WXHETriMeshOneModelMultiPartsParameters::OnChangingPhysicallyBasedParameters ) );
00161 
00162         ShowParametersValuesInGUI<T>();
00163 
00164         // Show the property dialog
00165         //ShowModel();  // show the dialog in model mode -- a model dialog blocks program flow and user input on other windows until it is dismissed.
00166         Show( true );           // show the dialog in modeless -- a modeless dialog behaves more like a frame in that program flow continues, and input in other winodws is still possible.
00167     }
00168     else {
00169         std::cout << "HETriMeshOneModelMultiPartsParameters's Property Dialog is not available!" << std::endl;
00170         wxMessageDialog( NULL, "WXHETriMeshOneModelMultiPartsParameters's Property Dialog is not available!", "Not Found", wxOK ).ShowModal();
00171     }
00172 }
00173 
00174 
00175 // Set IDs -- find and link wxWidgets contrils with the local pointers
00176 void WXHETriMeshOneModelMultiPartsParameters::SetIDs ()
00177 {
00178     m_bAllIDsWorking = true;
00179 
00180     m_pID_WXHeTmOmMp_Type           = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_Type" );
00181     m_pID_WXHeTmOmMp_Name_TextCtrl  = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_Name_TextCtrl" );
00182     m_pID_WXHeTmOmMp_Name_Button    = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_Name_Button" );
00183     //m_pID_WXHeTmOmMp_MassTotal        = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_MassTotal" );
00184     m_pID_WXHeTmOmMp_TrxTranslationX    = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxTranslationX" );
00185     m_pID_WXHeTmOmMp_TrxTranslationY    = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxTranslationY" );
00186     m_pID_WXHeTmOmMp_TrxTranslationZ    = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxTranslationZ" );
00187     m_pID_WXHeTmOmMp_TrxRotationAxisX   = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxRotationAxisX" );
00188     m_pID_WXHeTmOmMp_TrxRotationAxisY   = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxRotationAxisY" );
00189     m_pID_WXHeTmOmMp_TrxRotationAxisZ   = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxRotationAxisZ" );
00190     m_pID_WXHeTmOmMp_TrxRotationAngle   = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxRotationAngle" );
00191     m_pID_WXHeTmOmMp_TrxScaleX  = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxScaleX" );
00192     m_pID_WXHeTmOmMp_TrxScaleY  = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxScaleY" );
00193     m_pID_WXHeTmOmMp_TrxScaleZ  = (wxTextCtrl*) FindWindow( "ID_WXHeTmOmMp_TrxScaleZ" );
00194     m_pID_WXHeTmOmMp_TrxEnable  = (wxCheckBox*) FindWindow( "ID_WXHeTmOmMp_TrxEnable" );
00195     m_pID_WXHeTmOmMp_PartProp_Notebook  = (wxNotebook*) FindWindow( "ID_WXHeTmOmMp_PartProp_Notebook" );
00196 
00197     if      ( !m_pID_WXHeTmOmMp_Type )              m_bAllIDsWorking = false;
00198     else if ( !m_pID_WXHeTmOmMp_Name_TextCtrl )     m_bAllIDsWorking = false;
00199     else if ( !m_pID_WXHeTmOmMp_Name_Button )       m_bAllIDsWorking = false;
00200     //else if   ( !m_pID_WXHeTmOmMp_MassTotal )         m_bAllIDsWorking = false;
00201     else if ( !m_pID_WXHeTmOmMp_TrxTranslationX )   m_bAllIDsWorking = false;
00202     else if ( !m_pID_WXHeTmOmMp_TrxTranslationY )   m_bAllIDsWorking = false;
00203     else if ( !m_pID_WXHeTmOmMp_TrxTranslationZ )   m_bAllIDsWorking = false;
00204     else if ( !m_pID_WXHeTmOmMp_TrxRotationAxisX )  m_bAllIDsWorking = false;
00205     else if ( !m_pID_WXHeTmOmMp_TrxRotationAxisY )  m_bAllIDsWorking = false;
00206     else if ( !m_pID_WXHeTmOmMp_TrxRotationAxisZ )  m_bAllIDsWorking = false;
00207     else if ( !m_pID_WXHeTmOmMp_TrxRotationAngle )  m_bAllIDsWorking = false;
00208     else if ( !m_pID_WXHeTmOmMp_TrxScaleX )         m_bAllIDsWorking = false;
00209     else if ( !m_pID_WXHeTmOmMp_TrxScaleY )         m_bAllIDsWorking = false;
00210     else if ( !m_pID_WXHeTmOmMp_TrxScaleZ )         m_bAllIDsWorking = false;
00211     else if ( !m_pID_WXHeTmOmMp_TrxEnable )         m_bAllIDsWorking = false;
00212     else if ( !m_pID_WXHeTmOmMp_PartProp_Notebook ) m_bAllIDsWorking = false;
00213 
00214     if ( m_bAllIDsWorking ) {
00215         m_pID_WXHeTmOmMp_Type->SetId( ID_WXHeTmOmMp_Type );
00216         m_pID_WXHeTmOmMp_Name_TextCtrl->SetId( ID_WXHeTmOmMp_Name_TextCtrl );
00217         m_pID_WXHeTmOmMp_Name_Button->SetId( ID_WXHeTmOmMp_Name_Button );
00218         //m_pID_WXHeTmOmMp_MassTotal->SetId( ID_WXHeTmOmMp_MassTotal );
00219         m_pID_WXHeTmOmMp_TrxTranslationX->SetId( ID_WXHeTmOmMp_TrxTranslationX );
00220         m_pID_WXHeTmOmMp_TrxTranslationY->SetId( ID_WXHeTmOmMp_TrxTranslationY );
00221         m_pID_WXHeTmOmMp_TrxTranslationZ->SetId( ID_WXHeTmOmMp_TrxTranslationZ );
00222         m_pID_WXHeTmOmMp_TrxRotationAxisX->SetId( ID_WXHeTmOmMp_TrxRotationAxisX );
00223         m_pID_WXHeTmOmMp_TrxRotationAxisY->SetId( ID_WXHeTmOmMp_TrxRotationAxisY );
00224         m_pID_WXHeTmOmMp_TrxRotationAxisZ->SetId( ID_WXHeTmOmMp_TrxRotationAxisZ );
00225         m_pID_WXHeTmOmMp_TrxRotationAngle->SetId( ID_WXHeTmOmMp_TrxRotationAngle );
00226         m_pID_WXHeTmOmMp_TrxScaleX->SetId( ID_WXHeTmOmMp_TrxScaleX );
00227         m_pID_WXHeTmOmMp_TrxScaleY->SetId( ID_WXHeTmOmMp_TrxScaleY );
00228         m_pID_WXHeTmOmMp_TrxScaleZ->SetId( ID_WXHeTmOmMp_TrxScaleZ );
00229         m_pID_WXHeTmOmMp_TrxEnable->SetId( ID_WXHeTmOmMp_TrxEnable );
00230         m_pID_WXHeTmOmMp_PartProp_Notebook->SetId( ID_WXHeTmOmMp_PartProp_Notebook );
00231     }
00232 }
00233 
00234 
00235 // Set IDs -- find and link wxWidgets contrils with the local pointers
00236 void WXHETriMeshOneModelMultiPartsParameters::SetIDs_PartProps ( wxPanel * pPanel )
00237 {
00238     m_bAllIDsWorking = true;
00239 
00240     m_PartProps.push_back( PartProp() );
00241     
00242     m_PartProps.back().m_pID_WXHeTmOmMp_MassTotal           = (wxTextCtrl*) pPanel->FindWindow( "ID_WXHeTmOmMp_MassTotal" );
00243     m_PartProps.back().m_pID_WXHeTmOmMp_MassPt              = (wxTextCtrl*) pPanel->FindWindow( "ID_WXHeTmOmMp_MassPt" );
00244     m_PartProps.back().m_pID_WXHeTmOmMp_SpringStiffness     = (wxTextCtrl*) pPanel->FindWindow( "ID_WXHeTmOmMp_SpringStiffness" );
00245     m_PartProps.back().m_pID_WXHeTmOmMp_SpringDamper        = (wxTextCtrl*) pPanel->FindWindow( "ID_WXHeTmOmMp_SpringDamper" );
00246     m_PartProps.back().m_pID_WXHeTmOmMp_HomeSpringStiffness = (wxTextCtrl*) pPanel->FindWindow( "ID_WXHeTmOmMp_HomeSpringStiffness" );
00247     m_PartProps.back().m_pID_WXHeTmOmMp_HomeSpringDamper    = (wxTextCtrl*) pPanel->FindWindow( "ID_WXHeTmOmMp_HomeSpringDamper" );
00248     m_PartProps.back().m_pID_WXHeTmOmMp_SimTimeStep         = (wxTextCtrl*) pPanel->FindWindow( "ID_WXHeTmOmMp_SimTimeStep" );
00249     m_PartProps.back().m_pID_WXHeTmOmMp_NumOfSimIterations  = (wxTextCtrl*) pPanel->FindWindow( "ID_WXHeTmOmMp_NumOfSimIterations" );
00250     m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableSimulation = (wxCheckBox*) pPanel->FindWindow( "ID_WXHeTmOmMp_SimEnableSimulation" );
00251     m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableCollision  = (wxCheckBox*) pPanel->FindWindow( "ID_WXHeTmOmMp_SimEnableCollision" );
00252     m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableRendering  = (wxCheckBox*) pPanel->FindWindow( "ID_WXHeTmOmMp_SimEnableRendering" );
00253 
00254     if      ( !m_PartProps.back().m_pID_WXHeTmOmMp_MassTotal )              m_bAllIDsWorking = false;
00255     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_MassPt )                 m_bAllIDsWorking = false;
00256     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_SpringStiffness )        m_bAllIDsWorking = false;
00257     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_SpringDamper )           m_bAllIDsWorking = false;
00258     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_HomeSpringStiffness )    m_bAllIDsWorking = false;
00259     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_HomeSpringDamper )       m_bAllIDsWorking = false;
00260     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_SimTimeStep )            m_bAllIDsWorking = false;
00261     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_NumOfSimIterations )     m_bAllIDsWorking = false;
00262     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableSimulation )    m_bAllIDsWorking = false;
00263     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableCollision )     m_bAllIDsWorking = false;
00264     else if ( !m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableRendering )     m_bAllIDsWorking = false;
00265 
00266     if ( m_bAllIDsWorking ) {
00267         m_PartProps.back().m_pID_WXHeTmOmMp_MassTotal->SetId( ID_WXHeTmOmMp_MassTotal );
00268         m_PartProps.back().m_pID_WXHeTmOmMp_MassPt->SetId( ID_WXHeTmOmMp_MassPt );
00269         m_PartProps.back().m_pID_WXHeTmOmMp_SpringStiffness->SetId( ID_WXHeTmOmMp_SpringStiffness );
00270         m_PartProps.back().m_pID_WXHeTmOmMp_SpringDamper->SetId( ID_WXHeTmOmMp_SpringDamper );
00271         m_PartProps.back().m_pID_WXHeTmOmMp_HomeSpringStiffness->SetId( ID_WXHeTmOmMp_HomeSpringStiffness );
00272         m_PartProps.back().m_pID_WXHeTmOmMp_HomeSpringDamper->SetId( ID_WXHeTmOmMp_HomeSpringDamper );
00273         m_PartProps.back().m_pID_WXHeTmOmMp_SimTimeStep->SetId( ID_WXHeTmOmMp_SimTimeStep );
00274         m_PartProps.back().m_pID_WXHeTmOmMp_NumOfSimIterations->SetId( ID_WXHeTmOmMp_NumOfSimIterations );
00275         m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableSimulation->SetId( ID_WXHeTmOmMp_SimEnableSimulation );
00276         m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableCollision->SetId( ID_WXHeTmOmMp_SimEnableCollision );
00277         m_PartProps.back().m_pID_WXHeTmOmMp_SimEnableRendering->SetId( ID_WXHeTmOmMp_SimEnableRendering );
00278     }
00279 }
00280 
00281 
00282 // Initailize the looks of controls
00283 void WXHETriMeshOneModelMultiPartsParameters::InitControlLooks ()
00284 {
00285 //  HETriMeshOneModelMultiPartsParameters<double> * parDouble = static_cast<HETriMeshOneModelMultiPartsParameters<double> *>( m_pParameters );
00286 //  HETriMeshOneModelMultiPartsParameters<float> * parFloat  = static_cast<HETriMeshOneModelMultiPartsParameters<float> *>( m_pParameters );
00287 
00288     /*
00289     // Use CUDA
00290     #ifdef  TAPs_USE_CUDA
00291     {
00292         // DEBUG
00293         //wxSizer * sizer_ER_CUDA  = (wxSizer*) FindWindow( "sizer_ER_CUDA" );
00294         //if ( sizer_ER_CUDA )  std::cout << "FOUND sizer_ER_CUDA \n";
00295         //else                  std::cout << "NOT FOUND sizer_ER_CUDA \n";
00296 
00297         bool isCUDA;
00298         bool isCUDA_GenDrawData;
00299         if ( std::string( "double" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00300             isCUDA = parDouble->EnableCUDA;
00301             isCUDA_GenDrawData = parDouble->EnableCUDA_GenDrawData ;
00302         }
00303         else if ( std::string( "float" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00304             isCUDA = parFloat->EnableCUDA;
00305             isCUDA_GenDrawData = parFloat->EnableCUDA_GenDrawData ;
00306         }
00307         else {
00308             std::cout << m_pDataTypeInfo->name() << " type is not supported!\n";
00309         }
00310         m_pID_WXElasticRod_UseCUDA_PLHM->SetValue( m_bUseCUDA_PLHM );
00311         m_pID_WXElasticRod_UseCUDA_PLHM->Enable( false );
00312         m_pID_WXElasticRod_EnableCUDA->SetValue( isCUDA );
00313         m_pID_WXElasticRod_EnableCUDA_GenDrawData->SetValue( isCUDA_GenDrawData );
00314         m_pID_WXElasticRod_EnableCUDA_GenDrawData->Enable( isCUDA );
00315     }
00316     #else //TAPs_USE_CUDA
00317     {
00318         // Remove the GUI controls for knot recognition
00319         wxSizer * sizer_ER_sim = (wxSizer*) FindWindow( "sizer_ER_SimulationParameters" );
00320         wxSizer * sizer_ER_CUDA  = (wxSizer*) FindWindow( "sizer_ER_CUDA" );
00321         bool isFound = true;
00322         if ( !sizer_ER_sim ) {
00323             std::cout << "!NOT FOUND! the wxSizer named sizer_ER_SimulationParameters\n";
00324             isFound = false;
00325         }
00326         if ( !sizer_ER_CUDA ) {
00327             std::cout << "!NOT FOUND! the wxSizer named sizer_ER_CUDA\n";
00328             isFound = false;
00329         }
00330         if ( isFound ) {
00331             sizer_ER_sim->Detach( sizer_ER_CUDA );
00332         }
00333         else {
00334             wxStaticText * label_EnableCUDA = (wxStaticText*) FindWindow( "label_EnableCUDA" );
00335             wxCheckBox * chkBox_EnableCUDA = (wxCheckBox*) FindWindow( "ID_WXElasticRod_EnableCUDA" );
00336             wxStaticText * label_UseCUDA_PLHM = (wxStaticText*) FindWindow( "label_UseCUDA_PLHM" );
00337             wxCheckBox * chkBox_UseCUDA_PLHM = (wxCheckBox*) FindWindow( "ID_WXElasticRod_UseCUDA_PLHM" );
00338             wxStaticText * label_EnableCUDA_GenDrawData = (wxStaticText*) FindWindow( "label_EnableCUDA_GenDrawData" );
00339             wxCheckBox * chkBox_EnableCUDA_GenDrawData = (wxCheckBox*) FindWindow( "ID_WXElasticRod_EnableCUDA_GenDrawData" );
00340             if ( label_EnableCUDA ) {
00341                 label_EnableCUDA->Disable();
00342                 label_EnableCUDA->SetSize( 0, 0 );
00343             }
00344             if ( chkBox_EnableCUDA ) {
00345                 chkBox_EnableCUDA->Disable();
00346                 chkBox_EnableCUDA->SetSize( 0, 0 );
00347             }
00348             if ( label_UseCUDA_PLHM ) {
00349                 label_UseCUDA_PLHM->Disable();
00350                 label_UseCUDA_PLHM->SetSize( 0, 0 );
00351             }
00352             if ( chkBox_UseCUDA_PLHM ) {
00353                 chkBox_UseCUDA_PLHM->Disable();
00354                 chkBox_UseCUDA_PLHM->SetSize( 0, 0 );
00355             }
00356             if ( label_EnableCUDA_GenDrawData ) {
00357                 label_EnableCUDA_GenDrawData->Disable();
00358                 label_EnableCUDA_GenDrawData->SetSize( 0, 0 );
00359             }
00360             if ( chkBox_EnableCUDA_GenDrawData ) {
00361                 chkBox_EnableCUDA_GenDrawData->Disable();
00362                 chkBox_EnableCUDA_GenDrawData->SetSize( 0, 0 );
00363             }
00364         }
00365     }
00366     #endif//TAPs_USE_CUDA
00367     //*/
00368 }
00369 
00370 
00371 // Initailize the list of preset and userset, so that the user can select a parameter set from the GUI
00372 //void WXHETriMeshOneModelMultiPartsParameters::InitListOfPresetAndUserset ()
00373 //{
00374 //  if ( std::string( "double" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00375 //      LoadListOfParameterSetsFromFile<double>( g_vdPresets );
00376 //      LoadListOfParameterSetsFromFile<double>( g_vdUsersets );
00377 //  }
00378 //  else if ( std::string( "float" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00379 //      LoadListOfParameterSetsFromFile<float>( g_vfPresets );
00380 //      LoadListOfParameterSetsFromFile<float>( g_vfUsersets );
00381 //  }
00382 //  else {
00383 //      std::cout << m_pDataTypeInfo->name() << " type is not supported!\n";
00384 //  }
00385 //}
00386 
00387 
00389 //template <typename T>
00390 //void WXHETriMeshOneModelMultiPartsParameters::LoadListOfParameterSetsFromFile (   std::vector< HETriMeshOneModelMultiPartsParameters<T> > & parSets )
00391 //{
00392 //  TextFile * pTF;
00393 //  wxComboBox * pCB;
00394 //  if ( (void*)(&parSets) == (void*)(&g_vfPresets) || (void*)(&parSets) == (void*)(&g_vdPresets) ) {
00395 //      pTF = &g_PresetFile;
00396 //      pCB = m_pID_WXElasticRod_Load_Preset;
00397 //  }
00398 //  else {
00399 //      pTF = &g_UsersetFile;
00400 //      pCB = m_pID_WXElasticRod_Load_Userset;
00401 //  }
00402 //  if ( pCB == NULL )  return;
00403 //
00404 //  // Load the parameter sets
00405 //  std::string parameter;
00406 //  //pTF->Read();
00407 //  const std::string delims( " ,\t" );
00408 //  std::string::size_type begIdx, endIdx;
00409 //  std::string strName, strValue;
00410 //
00411 //  int idx = 0;    // index for accesing the parameter set
00412 //  for ( int i = 0; i < pTF->GetNumOfLines(); ++i ) {
00413 //      parameter = pTF->GetLine( i );
00414 //      // Search beginning of the first word
00415 //      begIdx = parameter.find_first_not_of( delims );
00416 //      // While beginning of a word found
00417 //      while ( begIdx != std::string::npos ) {
00418 //          // Search end of the actual word
00419 //          endIdx = parameter.find_first_of( delims, begIdx );
00420 //          if ( endIdx == std::string::npos ) {
00421 //              // End of word is end of line
00422 //              endIdx = parameter.length();
00423 //          }
00424 //          //-------------------------------------------------------
00425 //          // Process Parameter(s) -- Treat # as comment
00426 //          if ( !(parameter[begIdx] == '#') ) {
00427 //              strName = parameter.substr( begIdx, endIdx );
00428 //              //std::cout << idx << " strName: " << strName << "\n";
00429 //              //----------------------------------------------
00430 //              if      ( "Name" == strName ) {
00431 //                  // Get the name of the parameter set
00432 //                  begIdx = parameter.find_first_of( "\"", endIdx );
00433 //                  ++begIdx;
00434 //                  endIdx = parameter.find_first_of( "\"", begIdx );
00435 //                  HETriMeshOneModelMultiPartsParameters<T> parSet = *(static_cast<HETriMeshOneModelMultiPartsParameters<T> *>( m_pERParameters ));
00436 //                  parSet.Name = parameter.substr( begIdx, endIdx-begIdx );
00437 //
00438 //                  // Insert this parameter set into the list in alphabetical order (low-to-high)
00439 //                  if ( parSets.size() > 0 ) {
00440 //                      int insertPos = 0;
00441 //                      std::vector< HETriMeshOneModelMultiPartsParameters<T> >::iterator it = parSets.begin();
00442 //                      bool isNotInserted = true;
00443 //                      idx = 0;
00444 //                      while ( it != parSets.end() ) {
00445 //                          if ( 0 < it->Name.compare( parSet.Name ) ) {
00446 //                              parSets.insert( it, parSet );
00447 //                              isNotInserted = false;
00448 //                              idx;
00449 //                              break;
00450 //                          }
00451 //                          ++it; ++idx;
00452 //                      }
00453 //                      if ( isNotInserted ) {
00454 //                          // the current last element
00455 //                          parSets.push_back( parSet );
00456 //                          idx = parSets.size() - 1;
00457 //                      }
00458 //                  }
00459 //                  else {
00460 //                      // the first element
00461 //                      parSets.push_back( parSet );
00462 //                      idx = 0;
00463 //                  }
00464 //              }
00465 //              //else if   ( "NumOfLinks" == strName ) {
00466 //              //  begIdx = parameter.find_first_not_of( delims, endIdx );
00467 //              //  endIdx = parameter.find_first_of( delims, begIdx );
00468 //              //  parSets[idx].NumOfNodes = atoi( parameter.substr( begIdx, endIdx ).c_str() ) + 1;
00469 //              //}
00470 //              else if ( "Radius" == strName ) {
00471 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00472 //                  endIdx = parameter.find_first_of( delims, begIdx );
00473 //                  parSets[idx].Radius = atof( parameter.substr( begIdx, endIdx ).c_str() );
00474 //              }
00475 //              else if ( "Mass" == strName ) {
00476 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00477 //                  endIdx = parameter.find_first_of( delims, begIdx );
00478 //                  parSets[idx].TotalMass = atof( parameter.substr( begIdx, endIdx ).c_str() );
00479 //              }
00480 //              //else if   ( "Length" == strName ) {
00481 //              //  begIdx = parameter.find_first_not_of( delims, endIdx );
00482 //              //  endIdx = parameter.find_first_of( delims, begIdx );
00483 //              //  parSets[idx].TotalLength = atof( parameter.substr( begIdx, endIdx ).c_str() );
00484 //              //}
00485 //              else if ( "K_Kinetic_Translational" == strName ) {
00486 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00487 //                  endIdx = parameter.find_first_of( delims, begIdx );
00488 //                  parSets[idx].Kt = atof( parameter.substr( begIdx, endIdx ).c_str() );
00489 //              }
00490 //              else if ( "K_Kinetic_Rotational" == strName ) {
00491 //                  for ( int d = 0; d < 3; ++d ) {
00492 //                      begIdx = parameter.find_first_not_of( delims, endIdx );
00493 //                      endIdx = parameter.find_first_of( delims, begIdx );
00494 //                      parSets[idx].Kr[d] = atof( parameter.substr( begIdx, endIdx ).c_str() );
00495 //                  }
00496 //              }
00497 //              else if ( "K_Dissipation_Translational" == strName ) {
00498 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00499 //                  endIdx = parameter.find_first_of( delims, begIdx );
00500 //                  parSets[idx].Dt = atof( parameter.substr( begIdx, endIdx ).c_str() );
00501 //              }
00502 //              else if ( "K_Dissipation_Rotational" == strName ) {
00503 //                  for ( int d = 0; d < 3; ++d ) {
00504 //                      begIdx = parameter.find_first_not_of( delims, endIdx );
00505 //                      endIdx = parameter.find_first_of( delims, begIdx );
00506 //                      parSets[idx].Dr[d] = atof( parameter.substr( begIdx, endIdx ).c_str() );
00507 //                  }
00508 //              }
00509 //              else if ( "K_Constraint_3rdDirAlignTangent" == strName ) {
00510 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00511 //                  endIdx = parameter.find_first_of( delims, begIdx );
00512 //                  parSets[idx].Kconstraint_3rdDirAlignTangent = atof( parameter.substr( begIdx, endIdx ).c_str() );
00513 //              }
00514 //              else if ( "K_Damping_Velocity" == strName ) {
00515 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00516 //                  endIdx = parameter.find_first_of( delims, begIdx );
00517 //                  parSets[idx].Kvdamping = 1.0 - atof( parameter.substr( begIdx, endIdx ).c_str() );
00518 //              }
00519 //              else if ( "K_Stretching_Modulus" == strName ) {
00520 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00521 //                  endIdx = parameter.find_first_of( delims, begIdx );
00522 //                  parSets[idx].Kstretch_modulus = atof( parameter.substr( begIdx, endIdx ).c_str() );
00523 //              }
00524 //              else if ( "K_Bending_Modulus" == strName ) {
00525 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00526 //                  endIdx = parameter.find_first_of( delims, begIdx );
00527 //                  parSets[idx].Kbend_modulus = atof( parameter.substr( begIdx, endIdx ).c_str() );
00528 //              }
00529 //              else if ( "K_Shear_Modulus" == strName ) {
00530 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00531 //                  endIdx = parameter.find_first_of( delims, begIdx );
00532 //                  parSets[idx].Kshear_modulus = atof( parameter.substr( begIdx, endIdx ).c_str() );
00533 //              }
00534 //              else if ( "K_Material_Density" == strName ) {
00535 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00536 //                  endIdx = parameter.find_first_of( delims, begIdx );
00537 //                  parSets[idx].MaterialDensity = atof( parameter.substr( begIdx, endIdx ).c_str() );
00538 //              }
00539 //              //else if   ( "SimTimeStep" == strName ) {
00540 //              //  begIdx = parameter.find_first_not_of( delims, endIdx );
00541 //              //  endIdx = parameter.find_first_of( delims, begIdx );
00542 //              //  parSets[idx]. = atof( parameter.substr( begIdx, endIdx ).c_str() );
00543 //              //}
00544 //              //else if   ( "First_Point_Position" == strName ) {
00545 //              //  for ( int d = 0; d < 3; ++d ) {
00546 //              //      begIdx = parameter.find_first_not_of( delims, endIdx );
00547 //              //      endIdx = parameter.find_first_of( delims, begIdx );
00548 //              //      parSets[idx].[d] = atof( parameter.substr( begIdx, endIdx ).c_str() );
00549 //              //  }
00550 //              //}
00551 //              else if ( "K_Self_CDR" == strName ) {
00552 //                  begIdx = parameter.find_first_not_of( delims, endIdx );
00553 //                  endIdx = parameter.find_first_of( delims, begIdx );
00554 //                  parSets[idx].KselfCDR = atof( parameter.substr( begIdx, endIdx ).c_str() );
00555 //              }
00556 //          }
00557 //          begIdx = std::string::npos;
00558 //      }
00559 //  }
00560 //
00561 //  // Set the list in the ComboBox
00562 //  for ( int i = 0; i < parSets.size(); ++i ) {
00563 //      pCB->Append( parSets[i].Name );
00564 //
00565 //      // Calculate the parameter values
00566 //      // The NumOfNodes value is copied from the current parameter set
00567 //      // Here recalculate the LinkLength, MassOfPoint, and some of other parameters 
00568 //      // that are depending on the values of other parameters.
00569 //      parSets[i].CalDependentParameters();
00570 //
00571 //      //std::cout << "Set# " << i << "\n" << parSets[i] << "\n";
00572 //  }
00573 //}
00574 
00575 
00576 // Process events for editing a value for physically based parameters
00577 void WXHETriMeshOneModelMultiPartsParameters::OnEnteringParameters ( wxCommandEvent & event )
00578 {
00579     switch ( event.GetId() ) {
00580         case ID_WXHeTmOmMp_SimTimeStep:
00581             m_PartProps[m_pID_WXHeTmOmMp_PartProp_Notebook->GetSelection()].m_pID_WXHeTmOmMp_SimTimeStep->SetForegroundColour( color_textEdit );
00582     }
00583 }
00584 
00585 
00586 // Process events for changing physically based parameters
00587 void WXHETriMeshOneModelMultiPartsParameters::OnChangingParameters ( wxCommandEvent & event )
00588 {
00589     /*
00590     if ( std::string( "double" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00591         WritePhysicallyBasedParameters<double>( event );
00592     }
00593     else if ( std::string( "float" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00594         WritePhysicallyBasedParameters<float>( event );
00595     }
00596     else {
00597         std::cout << m_pDataTypeInfo->name() << " type is not supported!\n";
00598     }
00599     //Update();
00600     //*/
00601 }
00602 
00603 
00604 // Write values from the property dialog to the object's parameters
00605 template <typename T>
00606 void WXHETriMeshOneModelMultiPartsParameters::WriteParameters ( wxCommandEvent & event )
00607 {
00608     /*
00609     std::string strVal;
00610     HETriMeshOneModelMultiPartsParameters<T> * par = static_cast<HETriMeshOneModelMultiPartsParameters<T> *>( m_pERParameters );
00611     switch ( event.GetId() ) {
00612         case ID_WXElasticRod_Length:
00613             m_pID_WXElasticRod_Length->SetForegroundColour( color_textNormal );
00614             strVal = m_pID_WXElasticRod_Length->GetValue();
00615             //m_pID_WXElasticRod_Length->ChangeValue( strVal + " " );
00616             par->TotalLength = atof( strVal.c_str() );
00617             if ( std::string( "double" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00618                 // Recalculate the LinkLength, MassOfPoint, and some of other parameters 
00619                 // that are depending on the values of other parameters.
00620                 par->CalDependentParameters();
00621                 // Adjust all of the rest lengths of centerlines and orientations
00622                 CalAllRestLengths<T>();
00623             }
00624             else if ( std::string( "float" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00625                 // Recalculate the LinkLength, MassOfPoint, and some of other parameters 
00626                 // that are depending on the values of other parameters.
00627                 par->CalDependentParameters();
00628                 // Adjust all of the rest lengths of centerlines and orientations
00629                 CalAllRestLengths<T>();
00630             }
00631             else {
00632                 std::cout << m_pDataTypeInfo->name() << " type is not supported!\n";
00633             }
00634             break;
00635         case ID_WXElasticRod_Mass:
00636             m_pID_WXElasticRod_Mass->SetForegroundColour( color_textNormal );
00637             strVal = m_pID_WXElasticRod_Mass->GetValue();
00638             //m_pID_WXElasticRod_Mass->ChangeValue( strVal + " " );
00639             par->TotalMass = atof( strVal.c_str() );
00640             break;
00641         case ID_WXElasticRod_Radius:
00642             m_pID_WXElasticRod_Radius->SetForegroundColour( color_textNormal );
00643             strVal = m_pID_WXElasticRod_Radius->GetValue();
00644             //m_pID_WXElasticRod_Radius->ChangeValue( strVal + " " );
00645             par->Radius = atof( strVal.c_str() );
00646             break;
00647         //case ID_WXElasticRod_NumOfLinks:
00648         //  m_pID_WXElasticRod_NumOfLinks->SetForegroundColour( color_textNormal );
00649         //  strVal = m_pID_WXElasticRod_NumOfLinks->GetValue();
00650         //  //m_pID_WXElasticRod_NumOfLinks->ChangeValue( strVal + " " );
00651         //  par->NumOfNodes = atoi( strVal.c_str() ) + 1;
00652         //  break;
00653         case ID_WXElasticRod_StretchModulus:
00654             m_pID_WXElasticRod_StretchModulus->SetForegroundColour( color_textNormal );
00655             strVal = m_pID_WXElasticRod_StretchModulus->GetValue();
00656             //m_pID_WXElasticRod_StretchModulus->ChangeValue( strVal + " " );
00657             par->Kstretch_modulus = atof( strVal.c_str() );
00658             break;
00659         case ID_WXElasticRod_BendModulus:
00660             m_pID_WXElasticRod_BendModulus->SetForegroundColour( color_textNormal );
00661             strVal = m_pID_WXElasticRod_BendModulus->GetValue();
00662             //m_pID_WXElasticRod_BendModulus->ChangeValue( strVal + " " );
00663             par->Kbend_modulus = atof( strVal.c_str() );
00664             break;
00665         case ID_WXElasticRod_ShearModulus:
00666             m_pID_WXElasticRod_ShearModulus->SetForegroundColour( color_textNormal );
00667             strVal = m_pID_WXElasticRod_ShearModulus->GetValue();
00668             //m_pID_WXElasticRod_ShearModulus->ChangeValue( strVal + " " );
00669             par->Kshear_modulus = atof( strVal.c_str() );
00670             break;
00671         case ID_WXElasticRod_MaterialDensity:
00672             m_pID_WXElasticRod_MaterialDensity->SetForegroundColour( color_textNormal );
00673             strVal = m_pID_WXElasticRod_MaterialDensity->GetValue();
00674             //m_pID_WXElasticRod_MaterialDensity->ChangeValue( strVal + " " );
00675             par->MaterialDensity = atof( strVal.c_str() );
00676             break;
00677         case ID_WXElasticRod_KineticTranslational:
00678             m_pID_WXElasticRod_KineticTranslational->SetForegroundColour( color_textNormal );
00679             strVal = m_pID_WXElasticRod_KineticTranslational->GetValue();
00680             //m_pID_WXElasticRod_KineticTranslational->ChangeValue( strVal + " " );
00681             par->Kt = atof( strVal.c_str() );
00682             break;
00683         case ID_WXElasticRod_KineticRotational_0:
00684             m_pID_WXElasticRod_KineticRotational_0->SetForegroundColour( color_textNormal );
00685             strVal = m_pID_WXElasticRod_KineticRotational_0->GetValue();
00686             //m_pID_WXElasticRod_KineticRotational_0->ChangeValue( strVal + " " );
00687             par->Kr[0] = atof( strVal.c_str() );
00688             break;
00689         case ID_WXElasticRod_KineticRotational_1:
00690             m_pID_WXElasticRod_KineticRotational_1->SetForegroundColour( color_textNormal );
00691             strVal = m_pID_WXElasticRod_KineticRotational_1->GetValue();
00692             //m_pID_WXElasticRod_KineticRotational_1->ChangeValue( strVal + " " );
00693             par->Kr[1] = atof( strVal.c_str() );
00694             break;
00695         case ID_WXElasticRod_KineticRotational_2:
00696             m_pID_WXElasticRod_KineticRotational_2->SetForegroundColour( color_textNormal );
00697             strVal = m_pID_WXElasticRod_KineticRotational_2->GetValue();
00698             //m_pID_WXElasticRod_KineticRotational_2->ChangeValue( strVal + " " );
00699             par->Kr[2] = atof( strVal.c_str() );
00700             break;
00701         case ID_WXElasticRod_DissipationTranslational:
00702             m_pID_WXElasticRod_DissipationTranslational->SetForegroundColour( color_textNormal );
00703             strVal = m_pID_WXElasticRod_DissipationTranslational->GetValue();
00704             //m_pID_WXElasticRod_DissipationTranslational->ChangeValue( strVal + " " );
00705             par->Dt = atof( strVal.c_str() );
00706             break;
00707         case ID_WXElasticRod_DissipationRotational_0:
00708             m_pID_WXElasticRod_DissipationRotational_0->SetForegroundColour( color_textNormal );
00709             strVal = m_pID_WXElasticRod_DissipationRotational_0->GetValue();
00710             //m_pID_WXElasticRod_DissipationRotational_0->ChangeValue( strVal + " " );
00711             par->Dr[0] = atof( strVal.c_str() );
00712             break;
00713         case ID_WXElasticRod_DissipationRotational_1:
00714             m_pID_WXElasticRod_DissipationRotational_1->SetForegroundColour( color_textNormal );
00715             strVal = m_pID_WXElasticRod_DissipationRotational_1->GetValue();
00716             //m_pID_WXElasticRod_DissipationRotational_1->ChangeValue( strVal + " " );
00717             par->Dr[1] = atof( strVal.c_str() );
00718             break;
00719         case ID_WXElasticRod_DissipationRotational_2:
00720             m_pID_WXElasticRod_DissipationRotational_2->SetForegroundColour( color_textNormal );
00721             strVal = m_pID_WXElasticRod_DissipationRotational_2->GetValue();
00722             //m_pID_WXElasticRod_DissipationRotational_2->ChangeValue( strVal + " " );
00723             par->Dr[2] = atof( strVal.c_str() );
00724             break;
00725         case ID_WXElasticRod_Constraint_3rdDirAlignCenterline:
00726             m_pID_WXElasticRod_Constraint_3rdDirAlignCenterline->SetForegroundColour( color_textNormal );
00727             strVal = m_pID_WXElasticRod_Constraint_3rdDirAlignCenterline->GetValue();
00728             //m_pID_WXElasticRod_Constraint_3rdDirAlignCenterline->ChangeValue( strVal + " " );
00729             par->Kconstraint_3rdDirAlignTangent = atof( strVal.c_str() );
00730             break;
00731         case ID_WXElasticRod_DampingVelocity:
00732             m_pID_WXElasticRod_DampingVelocity->SetForegroundColour( color_textNormal );
00733             strVal = m_pID_WXElasticRod_DampingVelocity->GetValue();
00734             //m_pID_WXElasticRod_DampingVelocity->ChangeValue( strVal + " " );
00735             par->Kvdamping = 1.0 - atof( strVal.c_str() )/100.0;
00736             break;
00737     }
00738     DisplayERInfo( *par );
00739     par->CalDependentParameters();
00740     //*/
00741 }
00742 
00743 
00744 // Show the parameter values of the object in GUI
00745 template <typename T>
00746 void WXHETriMeshOneModelMultiPartsParameters::ShowParametersValuesInGUI ()
00747 {
00748     //ID_WXHeTmOmMp_Name_TextCtrl->ChangeValue( ... );
00749 
00750     // Transformation Support
00751     TransformationSupport<T> * pTrxSupport = static_cast<TransformationSupport<T> *>( m_pTrxSupport );
00752     // Translation
00753     Vector3<T> V( pTrxSupport->GetTranslation() );
00754     {std::ostringstream ss; ss << V[0];     m_pID_WXHeTmOmMp_TrxTranslationX->ChangeValue( ss.str() );}
00755     m_pID_WXHeTmOmMp_TrxTranslationX->SetForegroundColour( color_textNormal );
00756     {std::ostringstream ss; ss << V[1];     m_pID_WXHeTmOmMp_TrxTranslationY->ChangeValue( ss.str() );}
00757     m_pID_WXHeTmOmMp_TrxTranslationY->SetForegroundColour( color_textNormal );
00758     {std::ostringstream ss; ss << V[2];     m_pID_WXHeTmOmMp_TrxTranslationZ->ChangeValue( ss.str() );}
00759     m_pID_WXHeTmOmMp_TrxTranslationZ->SetForegroundColour( color_textNormal );
00760     // Rotation
00761     //...
00762     // Scale
00763     //...
00764 
00765     std::vector< SimPropForMultiPartMeshModel_HalfEdge<T> > * pParts = static_cast<std::vector< SimPropForMultiPartMeshModel_HalfEdge<T> > *>( m_pParts );
00766     for ( unsigned int i = 0; i < pParts->size(); ++i ) {
00767         {std::ostringstream ss; ss << pParts->at(i).GetPredefinedTimeStep();        m_PartProps[i].m_pID_WXHeTmOmMp_SimTimeStep->ChangeValue( ss.str() );}
00768         m_PartProps[i].m_pID_WXHeTmOmMp_SimTimeStep->SetForegroundColour( color_textNormal );
00769         {std::ostringstream ss; ss << pParts->at(i).GetNumSimSubSteps();        m_PartProps[i].m_pID_WXHeTmOmMp_NumOfSimIterations->ChangeValue( ss.str() );}
00770         m_PartProps[i].m_pID_WXHeTmOmMp_NumOfSimIterations->SetForegroundColour( color_textNormal );
00771         //{std::ostringstream ss;   ss << pParts->at(i).();     m_PartProps[i].->ChangeValue( ss.str() );}
00772         //m_PartProps[i].->SetForegroundColour( color_textNormal );
00773         //{std::ostringstream ss;   ss << pParts->at(i).();     m_PartProps[i].->ChangeValue( ss.str() );}
00774         //m_PartProps[i].->SetForegroundColour( color_textNormal );
00775         //{std::ostringstream ss;   ss << pParts->at(i).();     m_PartProps[i].->ChangeValue( ss.str() );}
00776         //m_PartProps[i].->SetForegroundColour( color_textNormal );
00777         //{std::ostringstream ss;   ss << pParts->at(i).();     m_PartProps[i].->ChangeValue( ss.str() );}
00778         //m_PartProps[i].->SetForegroundColour( color_textNormal );
00779     }
00780 
00781 
00782     /*
00783     // Set name
00784     m_pID_WXElasticRod_Current_Load_Parameter_Set->ChangeValue( par.Name );
00785 
00786     // The length is always from the current parameter, i.e. it is not allowed to change.
00787     HETriMeshOneModelMultiPartsParameters<T> * ERpar = static_cast<HETriMeshOneModelMultiPartsParameters<T> *>( m_pERParameters );
00788     par.TotalLength = ERpar->TotalLength;
00789 
00790     // Set values for physically based parameters
00791     {std::ostringstream ss; ss << par.TotalLength;          m_pID_WXElasticRod_Length->ChangeValue( ss.str() );}
00792     m_pID_WXElasticRod_Length->SetForegroundColour( color_textNormal );
00793     {std::ostringstream ss; ss << par.TotalMass;            m_pID_WXElasticRod_Mass->ChangeValue( ss.str() );}
00794     m_pID_WXElasticRod_Mass->SetForegroundColour( color_textNormal );
00795     {std::ostringstream ss; ss << par.Radius;               m_pID_WXElasticRod_Radius->ChangeValue( ss.str() );}
00796     m_pID_WXElasticRod_Radius->SetForegroundColour( color_textNormal );
00797     {std::ostringstream ss; ss << par.NumOfNodes-1;         m_pID_WXElasticRod_NumOfLinks->ChangeValue( ss.str() );}
00798     m_pID_WXElasticRod_NumOfLinks->SetForegroundColour( color_textNormal );
00799     {std::ostringstream ss; ss << par.Kstretch_modulus;     m_pID_WXElasticRod_StretchModulus->ChangeValue( ss.str() );}
00800     m_pID_WXElasticRod_StretchModulus->SetForegroundColour( color_textNormal );
00801     {std::ostringstream ss; ss << par.Kbend_modulus;        m_pID_WXElasticRod_BendModulus->ChangeValue( ss.str() );}
00802     m_pID_WXElasticRod_BendModulus->SetForegroundColour( color_textNormal );
00803     {std::ostringstream ss; ss << par.Kshear_modulus;       m_pID_WXElasticRod_ShearModulus->ChangeValue( ss.str() );}
00804     m_pID_WXElasticRod_ShearModulus->SetForegroundColour( color_textNormal );
00805     {std::ostringstream ss; ss << par.MaterialDensity;      m_pID_WXElasticRod_MaterialDensity->ChangeValue( ss.str() );}
00806     m_pID_WXElasticRod_MaterialDensity->SetForegroundColour( color_textNormal );
00807     {std::ostringstream ss; ss << par.Kt;                   m_pID_WXElasticRod_KineticTranslational->ChangeValue( ss.str() );}
00808     m_pID_WXElasticRod_KineticTranslational->SetForegroundColour( color_textNormal );
00809     {std::ostringstream ss; ss << par.Kr[0];                m_pID_WXElasticRod_KineticRotational_0->ChangeValue( ss.str() );}
00810     m_pID_WXElasticRod_KineticRotational_0->SetForegroundColour( color_textNormal );
00811     {std::ostringstream ss; ss << par.Kr[1];                m_pID_WXElasticRod_KineticRotational_1->ChangeValue( ss.str() );}
00812     m_pID_WXElasticRod_KineticRotational_1->SetForegroundColour( color_textNormal );
00813     {std::ostringstream ss; ss << par.Kr[2];                m_pID_WXElasticRod_KineticRotational_2->ChangeValue( ss.str() );}
00814     m_pID_WXElasticRod_KineticRotational_2->SetForegroundColour( color_textNormal );
00815     {std::ostringstream ss; ss << par.Dt;                   m_pID_WXElasticRod_DissipationTranslational->ChangeValue( ss.str() );}
00816     m_pID_WXElasticRod_DissipationTranslational->SetForegroundColour( color_textNormal );
00817     {std::ostringstream ss; ss << par.Dr[0];                m_pID_WXElasticRod_DissipationRotational_0->ChangeValue( ss.str() );}
00818     m_pID_WXElasticRod_DissipationRotational_0->SetForegroundColour( color_textNormal );
00819     {std::ostringstream ss; ss << par.Dr[1];                m_pID_WXElasticRod_DissipationRotational_1->ChangeValue( ss.str() );}
00820     m_pID_WXElasticRod_DissipationRotational_1->SetForegroundColour( color_textNormal );
00821     {std::ostringstream ss; ss << par.Dr[2];                m_pID_WXElasticRod_DissipationRotational_2->ChangeValue( ss.str() );}
00822     m_pID_WXElasticRod_DissipationRotational_2->SetForegroundColour( color_textNormal );
00823     {std::ostringstream ss; ss << par.Kconstraint_3rdDirAlignTangent;   m_pID_WXElasticRod_Constraint_3rdDirAlignCenterline->ChangeValue( ss.str() );}
00824     m_pID_WXElasticRod_Constraint_3rdDirAlignCenterline->SetForegroundColour( color_textNormal );
00825     {std::ostringstream ss; ss << (1.0-par.Kvdamping)*100;  m_pID_WXElasticRod_DampingVelocity->ChangeValue( ss.str() );}
00826     m_pID_WXElasticRod_DampingVelocity->SetForegroundColour( color_textNormal );
00827 
00828     // Set values for simulation parameters
00829     {std::ostringstream ss; ss << par.KselfCDR; m_pID_WXElasticRod_KselfCDR->ChangeValue( ss.str() );}
00830     m_pID_WXElasticRod_KselfCDR->SetForegroundColour( color_textNormal );
00831     {std::ostringstream ss; ss << par.TimeStep;                 m_pID_WXElasticRod_Sim_TimeStep->ChangeValue( ss.str() );}
00832     m_pID_WXElasticRod_Sim_TimeStep->SetForegroundColour( color_textNormal );
00833     {std::ostringstream ss; ss << par.TimeStep / par.NumOfCoreSimIterations;    m_pID_WXElasticRod_Sim_SubTimeStep->ChangeValue( ss.str() );}
00834     m_pID_WXElasticRod_Sim_SubTimeStep->SetForegroundColour( color_textNormal );
00835     {std::ostringstream ss; ss << par.NumOfIterations;          m_pID_WXElasticRod_Sim_Iterations->ChangeValue( ss.str() );}
00836     m_pID_WXElasticRod_Sim_Iterations->SetForegroundColour( color_textNormal );
00837     {std::ostringstream ss; ss << par.NumOfCoreSimIterations;   m_pID_WXElasticRod_Sim_CoreSimIterations->ChangeValue( ss.str() );}
00838     m_pID_WXElasticRod_Sim_CoreSimIterations->SetForegroundColour( color_textNormal );
00839     {std::ostringstream ss; ss << par.K_CDRwBV_Cylinder;    m_pID_WXElasticRod_CDRwBV_Cylinder->ChangeValue( ss.str() );}
00840     m_pID_WXElasticRod_CDRwBV_Cylinder->SetForegroundColour( color_textNormal );
00841     {std::ostringstream ss; ss << par.K_CDRwBV_Sphere;      m_pID_WXElasticRod_CDRwBV_Sphere->ChangeValue( ss.str() );}
00842     m_pID_WXElasticRod_CDRwBV_Sphere->SetForegroundColour( color_textNormal );
00843     //*/
00844 }
00845 
00846 
00847 // Process events for loading parameters
00848 void WXHETriMeshOneModelMultiPartsParameters::OnLoadParameters ( wxCommandEvent & event )
00849 {
00850     /*
00851     wxComboBox * pCB_preset  = m_pID_WXElasticRod_Load_Preset;
00852     wxComboBox * pCB_userset = m_pID_WXElasticRod_Load_Userset;
00853     int presetID  = pCB_preset->GetSelection();
00854     int usersetID = pCB_userset->GetSelection();
00855     if ( std::string( "double" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00856         switch ( event.GetId() ) {
00857             case ID_WXElasticRod_Load_Preset:
00858                 ApplyParameters<double>( g_vdPresets[presetID] );
00859                 break;
00860             case ID_WXElasticRod_Load_Userset:
00861                 ApplyParameters<double>( g_vdUsersets[usersetID] );
00862                 break;
00863         }
00864     }
00865     else if ( std::string( "float" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00866         switch ( event.GetId() ) {
00867             case ID_WXElasticRod_Load_Preset:
00868                 ApplyParameters<float>( g_vfPresets[presetID] );
00869                 break;
00870             case ID_WXElasticRod_Load_Userset:
00871                 ApplyParameters<float>( g_vfUsersets[usersetID] );
00872                 break;
00873         }
00874     }
00875     else {
00876         std::cout << m_pDataTypeInfo->name() << " type is not supported!\n";
00877     }
00878     //*/
00879 }
00880 
00881 
00882 /*
00883 // Apply parameters from the select parameter set to the object (and GUI)
00884 template <typename T>
00885 void WXHETriMeshOneModelMultiPartsParameters::ApplyParameters ( HETriMeshOneModelMultiPartsParameters<T> & par )
00886 {
00887     // Set parameter values in GUI from the passing parameters
00888     ShowParametersValuesInGUI( par );
00889 
00890     // Set parameter values in the Elastic Rod from the passing parameters
00891     HETriMeshOneModelMultiPartsParameters<T> * ERpar = static_cast<HETriMeshOneModelMultiPartsParameters<T> *>( m_pERParameters );
00892 
00893     //std::cout << "ERpar Before: " << *ERpar << std::endl;
00894 
00895     // Name
00896     ERpar->Name = par.Name;
00897 
00898     SetParametersFromGUI( *ERpar );
00899 
00900     //std::cout << "ERpar After: " << *ERpar << std::endl;
00901 }
00902 //*/
00903 
00904 
00905 // Process events for saving parameters
00906 void WXHETriMeshOneModelMultiPartsParameters::OnSaveParameters ( wxCommandEvent & event )
00907 {
00908     /*
00909     if ( std::string( "double" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00910         switch ( event.GetId() ) {
00911             case ID_WXElasticRod_Save_Userset_Btn:
00912                 SaveParameters<double>( g_vdUsersets );
00913                 break;
00914         }
00915     }
00916     else if ( std::string( "float" ).compare( m_pDataTypeInfo->name() ) == 0 ) {
00917         switch ( event.GetId() ) {
00918             case ID_WXElasticRod_Save_Userset_Btn:
00919                 SaveParameters<float>( g_vfUsersets );
00920                 break;
00921         }
00922     }
00923     else {
00924         std::cout << m_pDataTypeInfo->name() << " type is not supported!\n";
00925     }
00926     //*/
00927 }
00928 
00929 
00931 //template <typename T>
00932 //void WXHETriMeshOneModelMultiPartsParameters::SaveParameters ( std::vector< HETriMeshOneModelMultiPartsParameters<T> > & userSets )
00933 //{
00934 //  // Insert this parameter set into the list in alphabetical order (low-to-high)
00935 //  if ( userSets.size() > 0 ) {
00936 //      HETriMeshOneModelMultiPartsParameters<T> userSet = *(static_cast<HETriMeshOneModelMultiPartsParameters<T> *>( m_pERParameters ));
00937 //      wxComboBox * pCB  = m_pID_WXElasticRod_Load_Userset;
00938 //      wxTextCtrl * pTC  = m_pID_WXElasticRod_Save_Userset_Name;
00939 //      wxTextCtrl * pTC2 = m_pID_WXElasticRod_Current_Load_Parameter_Set;
00940 //
00941 //      userSet.Name = pTC->GetValue();
00942 //      SetParametersFromGUI( userSet );
00943 //      int insertPos = 0;
00944 //      std::vector< HETriMeshOneModelMultiPartsParameters<T> >::iterator it = userSets.begin();
00945 //      bool isNotInserted = true;
00946 //      while ( it != userSets.end() ) {
00947 //          if ( 0 < it->Name.compare( userSet.Name ) ) {
00948 //              userSets.insert( it, userSet );
00949 //              isNotInserted = false;
00950 //              break;
00951 //          }
00952 //          ++it;
00953 //      }
00954 //      if ( isNotInserted ) {
00955 //          // the current last element
00956 //          userSets.push_back( userSet );
00957 //      }
00958 //
00959 //      // Update the GUI
00960 //      pTC2->ChangeValue( pTC->GetValue() );
00961 //      pCB->Clear();
00962 //      it = userSets.begin();
00963 //      while ( it != userSets.end() ) {
00964 //          pCB->Append( it->Name );
00965 //          ++it;
00966 //      }
00967 //  }
00968 //  else {  // the first element
00969 //      userSets.push_back( HETriMeshOneModelMultiPartsParameters<T>() );
00970 //      SetParametersFromGUI( userSets.back() );
00971 //      wxComboBox * pCB  = m_pID_WXElasticRod_Load_Userset;
00972 //      wxTextCtrl * pTC  = m_pID_WXElasticRod_Save_Userset_Name;
00973 //      wxTextCtrl * pTC2 = m_pID_WXElasticRod_Current_Load_Parameter_Set;
00974 //      userSets.back().Name = pTC->GetValue();
00975 //      pTC2->ChangeValue( pTC->GetValue() );
00976 //      pCB->Append( userSets.back().Name );
00977 //  }
00978 //
00979 //
00980 //  // Write to the file
00981 //  std::ofstream out;
00982 //  out.open( g_UsersetFile.GetFileName().c_str(), std::ios::out );
00983 //  if ( !out.is_open() ) {
00984 //      std::cout << "Couldn't open file \"" << g_UsersetFile << "\" for writing!" << std::endl;
00985 //      return;
00986 //  }
00987 //  std::vector< HETriMeshOneModelMultiPartsParameters<T> >::iterator it = userSets.begin();
00988 //  while ( it != userSets.end() ) {
00989 //      std::string str( it->StrInfo() );
00990 //      out.write( str.c_str(), static_cast<int>( str.size() ) );
00991 //      out << std::endl;
00992 //      ++it;
00993 //  }
00994 //  out.close();
00995 //}
00996 
00997 
00998 /*
00999 // Set the parameter values from GUI to the passing parameter set
01000 template <typename T>
01001 void WXHETriMeshOneModelMultiPartsParameters::SetParametersFromGUI ( HETriMeshOneModelMultiPartsParameters<T> & par )
01002 {
01003     std::string strVal;
01004 
01005     // Name
01006     strVal = m_pID_WXElasticRod_Mass->GetValue();
01007     par.TotalMass = atof( strVal.c_str() );
01008 
01009     // Physically based parameters
01010     strVal = m_pID_WXElasticRod_Length->GetValue();
01011     par.TotalLength = atof( strVal.c_str() );
01012     strVal = m_pID_WXElasticRod_Mass->GetValue();
01013     par.TotalMass = atof( strVal.c_str() );
01014     strVal = m_pID_WXElasticRod_Radius->GetValue();
01015     par.Radius = atof( strVal.c_str() );
01016     strVal = m_pID_WXElasticRod_NumOfLinks->GetValue();
01017     par.NumOfNodes = atoi( strVal.c_str() ) + 1;
01018     strVal = m_pID_WXElasticRod_StretchModulus->GetValue();
01019     par.Kstretch_modulus = atof( strVal.c_str() );
01020     strVal = m_pID_WXElasticRod_BendModulus->GetValue();
01021     par.Kbend_modulus = atof( strVal.c_str() );
01022     strVal = m_pID_WXElasticRod_ShearModulus->GetValue();
01023     par.Kshear_modulus = atof( strVal.c_str() );
01024     strVal = m_pID_WXElasticRod_MaterialDensity->GetValue();
01025     par.MaterialDensity = atof( strVal.c_str() );
01026     strVal = m_pID_WXElasticRod_KineticTranslational->GetValue();
01027     par.Kt = atof( strVal.c_str() );
01028     strVal = m_pID_WXElasticRod_KineticRotational_0->GetValue();
01029     par.Kr[0] = atof( strVal.c_str() );
01030     strVal = m_pID_WXElasticRod_KineticRotational_1->GetValue();
01031     par.Kr[1] = atof( strVal.c_str() );
01032     strVal = m_pID_WXElasticRod_KineticRotational_2->GetValue();
01033     par.Kr[2] = atof( strVal.c_str() );
01034     strVal = m_pID_WXElasticRod_DissipationTranslational->GetValue();
01035     par.Dt = atof( strVal.c_str() );
01036     strVal = m_pID_WXElasticRod_DissipationRotational_0->GetValue();
01037     par.Dr[0] = atof( strVal.c_str() );
01038     strVal = m_pID_WXElasticRod_DissipationRotational_1->GetValue();
01039     par.Dr[1] = atof( strVal.c_str() );
01040     strVal = m_pID_WXElasticRod_DissipationRotational_2->GetValue();
01041     par.Dr[2] = atof( strVal.c_str() );
01042     strVal = m_pID_WXElasticRod_Constraint_3rdDirAlignCenterline->GetValue();
01043     par.Kconstraint_3rdDirAlignTangent = atof( strVal.c_str() );
01044     strVal = m_pID_WXElasticRod_DampingVelocity->GetValue();
01045     par.Kvdamping = 1.0 - atof( strVal.c_str() )/100.0;
01046 
01047     // Simulation parameters
01048     strVal = m_pID_WXElasticRod_KselfCDR->GetValue();
01049     par.KselfCDR = atof( strVal.c_str() );
01050     strVal = m_pID_WXElasticRod_Sim_TimeStep->GetValue();
01051     par.TimeStep = atof( strVal.c_str() );
01052     strVal = m_pID_WXElasticRod_Sim_Iterations->GetValue();
01053     par.NumOfIterations = atof( strVal.c_str() );
01054     strVal = m_pID_WXElasticRod_Sim_CoreSimIterations->GetValue();
01055     par.NumOfCoreSimIterations = atof( strVal.c_str() );
01056     strVal = m_pID_WXElasticRod_CDRwBV_Cylinder->GetValue();
01057     par.K_CDRwBV_Cylinder = atof( strVal.c_str() );
01058     strVal = m_pID_WXElasticRod_CDRwBV_Sphere->GetValue();
01059     par.K_CDRwBV_Sphere = atof( strVal.c_str() );
01060 
01061     // Rendering parameters
01062 
01063 
01064     // Recalculate the LinkLength, MassOfPoint, and some of other parameters 
01065     // that are depending on the values of other parameters.
01066     par.CalDependentParameters();
01067     // Adjust all of the rest lengths of centerlines and orientations
01068     CalAllRestLengths<T>();
01069 }
01070 //*/
01071 
01072 //-----------------------------------------------------------------------------
01073 //=============================================================================
01074 END_NAMESPACE_TAPs__WX
01075 //34567890123456789012345678901234567890123456789012345678901234567890123456789
01076 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines