void MyFrame::OnScaleFrequencies(wxCommandEvent& event) { char oldFactorStringC[4096]; sprintf(oldFactorStringC,"%f", uiState.lastFrequencyScaleFactor); wxDialog * dlg = new wxDialog(this, -1, _T("Scale frequency spectrum"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, _T("dialogBox") ); wxBoxSizer * dlgSizer = new wxBoxSizer(wxVERTICAL); wxStaticText * factorText = new wxStaticText(dlg, -1, _T("Multiplicative factor:"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER, _T( "staticText")); wxTextCtrl * factorControl = new wxTextCtrl(dlg, -1, wxString(oldFactorStringC, wxConvUTF8), wxDefaultPosition, wxSize(80,-1), 0, wxDefaultValidator); wxBoxSizer * factorControlSizer = new wxBoxSizer(wxHORIZONTAL); factorControlSizer->Add(factorText, 0, wxCENTER); factorControlSizer->Add(factorControl, 0, wxCENTER); dlgSizer->Add(factorControlSizer, 0, wxALL | wxCENTER, 8); dlgSizer->Add(dlg->CreateButtonSizer(wxOK | wxCANCEL), 0, wxLEFT | wxRIGHT | wxBOTTOM | wxCENTER, 8); dlg->SetSizer(dlgSizer); dlgSizer->SetSizeHints(dlg); if (dlg->ShowModal() != wxID_OK) { delete(dlg); return; } double multiplicativeFactor; if (!(factorControl->GetValue().ToDouble(&multiplicativeFactor))) { errMsg(_T("Invalid scaling factor"), _T("Invalid scaling factor: ") + factorControl->GetValue()); delete(dlg); return; } delete(dlg); for(int i=0; i<precomputationState.rLin; i++) precomputationState.frequencies[i] *= multiplicativeFactor; ScaleYoungsModulus(multiplicativeFactor * multiplicativeFactor); uiState.lastFrequencyScaleFactor = multiplicativeFactor; UpdateModalToolbar(); }
void MyFrame::EnableModalToolbar(bool enable) { modeSelectionControl->Enable(enable); modeSelectionText->Enable(enable); frequencyText->Enable(enable); frequencyTextCtrl->Enable(enable); modeAmplitudeText->Enable(enable); modeAmplitudeControl->Enable(enable); UpdateModalToolbar(); }
void MyFrame::OnLoadFrequencies(wxCommandEvent& event) { wxFileDialog *dlg = new wxFileDialog(this, _T("Load frequencies"), uiState.currentWorkingDirectory, _T(""), _T("Frequency Files(*.freq)|*.freq|All files(*.*)|*.*"), wxFD_OPEN /*| wxHIDE_READONLY*/, wxDefaultPosition); if ( dlg->ShowModal() == wxID_OK ) { wxString frequencyFilename( dlg->GetPath() ); SaveCurrentWorkingDirectory(frequencyFilename); if( !frequencyFilename.empty() ) { int newr; double * newFrequencies = NULL; int m1; SetCursor(*wxHOURGLASS_CURSOR); const char * filename = frequencyFilename.mb_str(); int code = ReadMatrixFromDisk((char*)filename, &newr, &m1, &newFrequencies); SetCursor(*wxSTANDARD_CURSOR); if (code != 0) { this->errMsg( _T("Loading error"), _T("Unable to load frequencies from ") + frequencyFilename ); dlg->Destroy(); return; } if (precomputationState.linearModesAvailable && (newr != precomputationState.rLin)) { char s[4096]; const char * filename = frequencyFilename.mb_str(); sprintf(s, "The number of frequencies (%d) " "in %s does not match the currently available number of linear modes (%d).", newr, (char*)filename, precomputationState.rLin); this->errMsg( _T("Loading error"), wxString(s, wxConvUTF8)); free(newFrequencies); dlg->Destroy(); return; } // success free(precomputationState.frequencies); precomputationState.rLin = newr; precomputationState.frequencies = newFrequencies; precomputationState.frequenciesAvailable = true; UpdateMenus(); UpdateModalToolbar(); Refresh(); } } dlg->Destroy(); }
void MyFrame::OnScaleTo1Hz(wxCommandEvent& event) { wxMessageDialog * confirmationDialog = new wxMessageDialog (this, _T("Scale frequency spectrum so that lowest frequency is at 1.0 Hz ?"), _T("Scale frequency spectrum"), wxYES_NO | wxICON_QUESTION); if (confirmationDialog->ShowModal() == wxID_YES) { double factor = 1.0 / precomputationState.frequencies[precomputationState.numRigidModes]; for(int i=0; i<precomputationState.rLin; i++) precomputationState.frequencies[i] *= factor; ScaleYoungsModulus(factor * factor); } UpdateModalToolbar(); delete(confirmationDialog); }
void MyFrame::SetAutoRenderingMagnitude(ModalMatrix * modalMatrix) { // determine rendered magnitude // renderedMagnitude * maxAmplitude = 0.1 * radius double maxMagnitude = MaxModeMagnitude(modalMatrix); double renderingMagnitude; if (maxMagnitude < -0.1) { renderingMagnitude = 1.0; wxMessageDialog * dlg = new wxMessageDialog (this, _T("Warning: the modes contain NaN entries."), _T("NaN entries detected in the modes"), wxOK | wxICON_EXCLAMATION); dlg->ShowModal(); dlg->Destroy(); } else if (maxMagnitude < 1e-8) { renderingMagnitude = 1.0; wxMessageDialog * dlg = new wxMessageDialog (this, _T("Warning: the modes have extremely small magnitude (might be zero)."), _T("Extremely small magnitude modes"), wxOK | wxICON_EXCLAMATION); dlg->ShowModal(); dlg->Destroy(); } else renderingMagnitude = 0.35 * precomputationState.simulationMeshGeometricParameters.radius / maxMagnitude; char s[4096]; sprintf(s, "%.3f", renderingMagnitude); modeAmplitudeControl->SetValue(wxString(s, wxConvUTF8)); UpdateModalToolbar(); }
void MyFrame::OnDeleteFrequencies(wxCommandEvent& event) { char eraseRangeLoC[96]; char eraseRangeHiC[96]; sprintf(eraseRangeLoC, "%d", uiState.eraseRangeLo+1); sprintf(eraseRangeHiC, "%d", uiState.eraseRangeHi); wxDialog * dlg = new wxDialog(this, -1, _T("Select the frequency range to be erased"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, _T("dialogBox") ); wxBoxSizer * dlgSizer = new wxBoxSizer(wxVERTICAL); wxStaticText * staticText1 = new wxStaticText(dlg, -1, _T("Erase frequencies from: "), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER, _T( "staticText")); wxStaticText * staticText2 = new wxStaticText(dlg, -1, _T(" to: "), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER, _T( "staticText")); wxTextCtrl * eraseRangeLoControl = new wxTextCtrl(dlg, -1, wxString(eraseRangeLoC, wxConvUTF8), wxDefaultPosition, wxSize(100,-1)); wxTextCtrl * eraseRangeHiControl = new wxTextCtrl(dlg, -1, wxString(eraseRangeHiC, wxConvUTF8), wxDefaultPosition, wxSize(100,-1)); wxBoxSizer * sizer1 = new wxBoxSizer(wxHORIZONTAL); sizer1->Add(staticText1, 0, wxCENTER); sizer1->Add(eraseRangeLoControl, 0, wxCENTER); sizer1->Add(staticText2, 0, wxCENTER); sizer1->Add(eraseRangeHiControl, 0, wxCENTER); dlgSizer->Add(sizer1, 0, wxALL | wxCENTER, 8); dlgSizer->Add(dlg->CreateButtonSizer(wxOK | wxCANCEL), 0, wxLEFT | wxRIGHT | wxBOTTOM | wxCENTER, 8); dlg->SetSizer(dlgSizer); dlgSizer->SetSizeHints(dlg); if (dlg->ShowModal() != wxID_OK) { delete(dlg); return; } wxString valueStringLo = eraseRangeLoControl->GetValue(); wxString valueStringHi = eraseRangeHiControl->GetValue(); delete(dlg); long valueLo; bool goodInput = valueStringLo.ToLong(&valueLo); long valueHi; goodInput = goodInput && valueStringHi.ToLong(&valueHi); if (goodInput) { if ((valueLo <= 0) || (valueLo > precomputationState.rLin)) goodInput = false; if ((valueHi <= 0) || (valueHi > precomputationState.rLin)) goodInput = false; if (valueLo > valueHi) goodInput = false; } if (!goodInput) { this->errMsg( _T("Incorrect frequency range"), _T("Error: Incorrect frequency range")); return; } uiState.eraseRangeLo = valueLo - 1; uiState.eraseRangeHi = valueHi; int numErasedFrequencies = uiState.eraseRangeHi - uiState.eraseRangeLo; int n3 = 3 * precomputationState.simulationMesh->getNumVertices(); double * U = (double*) malloc (sizeof(double) * n3 * precomputationState.rLin); memcpy(U, (precomputationState.linearModalMatrix)->GetMatrix(), sizeof(double) * n3 * precomputationState.rLin); // erase frequencies and linear modes for(int i=uiState.eraseRangeHi; i<precomputationState.rLin; i++) { precomputationState.frequencies[i-numErasedFrequencies] = precomputationState.frequencies[i]; memcpy(&U[ELT(n3,0,i-numErasedFrequencies)], &U[ELT(n3,0,i)], sizeof(double) * n3); } precomputationState.rLin -= numErasedFrequencies; precomputationState.frequencies = (double*) realloc (precomputationState.frequencies, sizeof(double) * precomputationState.rLin); delete(precomputationState.linearModalMatrix); int noInternalCopy = 1; precomputationState.linearModalMatrix = new ModalMatrix(n3 / 3, precomputationState.rLin, U, noInternalCopy); if (modeSelectionControl->GetValue() > precomputationState.rLin) modeSelectionControl->SetValue(precomputationState.rLin); modeSelectionControl->SetRange(1, precomputationState.rLin); UpdateModalToolbar(); }
void MyFrame::OnChangeRenderingAmplitude(wxCommandEvent& event) { if ((modeAmplitudeControl != NULL) && (modeAmplitudeControl->GetValue() != _T("--"))) UpdateModalToolbar(); }
void MyFrame::OnChangeRenderedMode(wxSpinEvent& event) { UpdateModalToolbar(); }