Пример #1
0
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();
}
Пример #2
0
void MyFrame::EnableModalToolbar(bool enable)
{
  modeSelectionControl->Enable(enable);
  modeSelectionText->Enable(enable);
  frequencyText->Enable(enable);
  frequencyTextCtrl->Enable(enable);
  modeAmplitudeText->Enable(enable);
  modeAmplitudeControl->Enable(enable);

  UpdateModalToolbar();
}
Пример #3
0
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();
}
Пример #4
0
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);
}
Пример #5
0
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();
}
Пример #6
0
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();
}
Пример #7
0
void MyFrame::OnChangeRenderingAmplitude(wxCommandEvent& event)
{
  if ((modeAmplitudeControl != NULL) && (modeAmplitudeControl->GetValue() != _T("--")))
    UpdateModalToolbar();
}
Пример #8
0
void MyFrame::OnChangeRenderedMode(wxSpinEvent& event)
{
  UpdateModalToolbar();
}