![]() |
TAPs 0.7.7.3
|
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----+----