#include <ArrayResponse.h>
Public Slots | |
void | setAzimuth (double azimuth) |
void | setKmax (double kmax) |
void | setKmin (double kmin) |
Signals | |
void | kmaxChanged (double kmin) |
void | kminChanged (double kmin) |
Public Member Functions | |
ArrayResponse (QWidget *parent=0, Qt::WFlags fl=0) | |
void | createObjects (bool showDispersion) |
double | kmax () const |
double | kmin () const |
void | setArray (const QVector< Point2D > &p) |
void | setFrequencySampling (SamplingParameters &fparam) |
~ArrayResponse () |
ArrayGui::ArrayResponse::ArrayResponse | ( | QWidget * | parent = 0 , |
Qt::WFlags | fl = 0 |
||
) |
References SciFigs::GraphicSheetMenu::_childLayout, SciFigs::ColorPaletteWidget::defaultColors(), setAzimuth(), setKmax(), setKmin(), SciFigs::GraphicObject::setObjectName(), and TRACE.
: GraphicSheetMenu(parent, fl), waveNum(this), _palette(0) { TRACE; setAttribute(Qt::WA_DeleteOnClose); _palette.defaultColors(20); _palette.setObjectName( "Palette" ); Settings::getSize(this, "ArrayResponse"); _childLayout->addWidget(&waveNum); connect(waveNum.kminSpin, SIGNAL(valueChanged(double)), this, SLOT(setKmin( double))); connect(waveNum.kmaxSpin, SIGNAL(valueChanged(double)), this, SLOT(setKmax( double))); connect(waveNum.azimuthSpin, SIGNAL(valueChanged(double)), this, SLOT(setAzimuth( double) )); _kmin=0.0; _kmaxSolver=0; _kmaxTouched=false; _gridLayer=0; _circleLayer=0; _directionLayer=0; _crossGrayLayer=0; _midHeightLayer=0; _crossBlackLayer=0; _dispLimitLayer=0; }
References ArrayCore::KmaxSolver::terminate(), and TRACE.
void ArrayGui::ArrayResponse::createObjects | ( | bool | showDispersion | ) |
References SciFigs::GraphicSheetMenu::_sheet, QGpGuiWave::DispersionLimitLayer::addArrayLimits(), SciFigs::GraphicSheetMenu::addGraph(), SciFigs::LineLayer::addLine(), SciFigs::GraphicSheet::addObject(), SciFigs::GraphicSheetMenu::addText(), QGpCoreTools::Curve< pointType >::append(), kmaxChanged(), kminChanged(), SciFigs::ColorPaletteWidget::palette(), SciFigs::CircleViewer::resize(), SciFigs::LiveGridLayer::setAutoAdjustPalette(), SciFigs::GraphContentLayer::setEditable(), SciFigs::GraphicSheetMenu::setFrequencyTitles(), SciFigs::GraphicSheetMenu::setGraphGeometry(), SciFigs::XUniqueYColorLines::setLineWeight(), SciFigs::ColorPaletteWidget::setOrientation(), SciFigs::GridPlot::setPalette(), SciFigs::AbstractLine::setPen(), SciFigs::GraphicObject::setPrintHeight(), SciFigs::GraphicObject::setPrintWidth(), SciFigs::GraphicObject::setPrintXAnchor(), SciFigs::GraphicObject::setPrintYAnchor(), SciFigs::Axis::setRange(), SciFigs::LineLayer::setReferenceLine(), SciFigs::LiveGridLayer::setSampling(), SciFigs::Axis::setSizeInfo(), SciFigs::Axis::setSizeType(), SciFigs::AbstractLine::setSymbol(), SciFigs::ColorPaletteWidget::setTitle(), SciFigs::Axis::setTitle(), SciFigs::Axis::setTitleInversedScale(), SciFigs::ColorPaletteWidget::setVLinear(), QGpCoreTools::tr(), TRACE, SciFigs::AxisWindow::updateExternalGeometry(), SciFigs::AxisWindow::updateGeometry(), SciFigs::AxisWindow::xAxis(), and SciFigs::AxisWindow::yAxis().
{ TRACE; AxisWindow * w; // Color palette _palette.setPrintXAnchor(9.5); _palette.setPrintYAnchor(0.5); _palette.setOrientation(Axis::West); _palette.setPrintWidth(1.7); _palette.setPrintHeight(8.0); _palette.setTitle(tr("Array transfer function")); _sheet.addObject(&_palette); // Wavenumber map w=addGraph(); w->xAxis()->setTitle(tr("Wave number X (rad/m)")); w->xAxis()->setTitleInversedScale(tr("Wave length X/(2*pi) (m/rad)")); w->yAxis()->setTitle(tr("Wave number Y (rad/m)")); w->yAxis()->setTitleInversedScale(tr("Wave length Y/(2*pi) (m/rad)")); w->xAxis()->setSizeType(Axis::AxisSize); w->xAxis()->setSizeInfo(7); w->setPrintXAnchor(0.5); w->yAxis()->setSizeType(Axis::AxisSize); w->yAxis()->setSizeInfo(7); w->setPrintYAnchor(0.5); w->updateExternalGeometry(); w->updateGeometry(); _gridLayer=new LiveGridLayer(w); _gridLayer->setObjectName("theoretical FK map"); _gridLayer->setSampling(3); _gridLayer->setPalette(_palette.palette()); _gridLayer->setAutoAdjustPalette(false); connect(_gridLayer, SIGNAL(paletteChanged(ColorPalette)), &_palette, SLOT(setPalette(const ColorPalette&))); connect(&_palette, SIGNAL(changed(ColorPalette)), _gridLayer, SLOT(setPalette(const ColorPalette&))); _circleLayer=new CircleViewer(w); _circleLayer->setObjectName( "FK limits" ); _circleLayer->resize(2); _directionLayer=new LineLayer(w); _directionLayer->setObjectName( "Azimuth" ); _directionLayer->setEditable(false); PlotLine2D * line; line=new PlotLine2D; line->setPen(Pen( Qt::black, 0.6, Qt::SolidLine)); line->setSymbol(Symbol()); _directionLayer->setReferenceLine(line); static_cast<PlotLine2D *>(_directionLayer->addLine())->curve().resize(2); static_cast<PlotLine2D *>(_directionLayer->addLine())->curve().resize(2); _palette.setVLinear(0.0, 1.0); // Wavenumber map cross section w=addGraph(); w->xAxis()->setTitle(tr("Wave number (rad/m)")); w->xAxis()->setTitleInversedScale(tr("Wave length/(2*pi) (m/rad)")); w->yAxis()->setTitle(tr("Array Transfer function")); w->yAxis()->setTitleInversedScale(tr("1/Array Transfer function")); setGraphGeometry(w, 0.5, 9.0, 9.0, 6.0); _crossGrayLayer=new XUniqueYColorLines(w); _crossGrayLayer->setObjectName( "Cross background" ); _crossGrayLayer->setLineWeight(0.025); _crossBlackLayer=new LineLayer(w); _crossBlackLayer->setObjectName( "Cross current" ); line=new PlotLine2D; line->setPen(Pen( Qt::black, 0.6, Qt::SolidLine) ); line->setSymbol(Symbol()); _crossBlackLayer->setReferenceLine(line); _crossBlackLayer->addLine(); _crossBlackLayer->addLine(); _midHeightLayer=new LineLayer(w); _midHeightLayer->setEditable(false); line=new PlotLine2D; line->setPen(Pen( Qt::black, 0.4, Qt::SolidLine) ); line->setSymbol(Symbol()); _midHeightLayer->setReferenceLine(line); Curve<Point2D>& limitLine=static_cast<PlotLine2D *>(_midHeightLayer->addLine())->curve(); limitLine.append(Point2D(-1e99,0.5)); limitLine.append(Point2D(1e99,0.5)); w->yAxis()->setRange(0.0, 1.0); if(showDispersion) { // Frequency-Velocity plot w=addGraph(); setFrequencyTitles(w, tr("Slowness (s/m)"), tr("Velocity (m/s)"), Number::Fixed); setGraphGeometry(w, 10.0, 9.0, 9.0, 6.0); _dispLimitLayer=new DispersionLimitLayer(w); _dispLimitLayer->setObjectName( "FK dispersion limits" ); _dispLimitLayer->addArrayLimits(); connect(this, SIGNAL(kminChanged(double)), _dispLimitLayer, SLOT(setArrayKmin(double))); connect(this, SIGNAL(kmaxChanged(double)), _dispLimitLayer, SLOT(setArrayKmax(double))); w->yAxis()->setRange(0.0, 0.01); } else { _dispLimitLayer=0; } // Comments _comments=addText(11.5, 0.5, 5.0, 5.0); }
double ArrayGui::ArrayResponse::kmax | ( | ) | const |
Referenced by setAzimuth().
{
return waveNum.kmaxSpin->value();
}
void ArrayGui::ArrayResponse::kmaxChanged | ( | double | kmin | ) | [signal] |
Referenced by createObjects(), and setKmax().
double ArrayGui::ArrayResponse::kmin | ( | ) | const |
{
return waveNum.kminSpin->value();
}
void ArrayGui::ArrayResponse::kminChanged | ( | double | kmin | ) | [signal] |
Referenced by createObjects(), and setKmin().
void ArrayGui::ArrayResponse::setArray | ( | const QVector< Point2D > & | p | ) |
References ArrayCore::KminSolver::calculate(), ArrayCore::KmaxSolver::calculate(), SciFigs::XUniqueYColorLines::clear(), SciFigs::AbstractLine::clear(), SciFigs::LineLayer::line(), SciFigs::GraphContentLayer::lockDelayPainting(), setAzimuth(), SciFigs::LiveGridLayer::setFunction(), setKmin(), SciFigs::TextEdit::setText(), ArrayCore::KmaxSolver::terminate(), QGpCoreTools::tr(), TRACE, SciFigs::GraphContentLayer::unlock(), and SciFigs::TextEdit::update().
{ TRACE; if(_kmaxSolver) { _kmaxSolver->terminate(); _kmaxSolver->deleteLater(); _kmaxSolver=0; } _kmaxTouched=false; _gridLayer->lockDelayPainting(); // required before touching the stations _stations=p; _gridLayer->setFunction(new TheoreticalFK(_stations)); shiftStations(); _gridLayer->unlock(); _crossBlackLayer->lockDelayPainting(); _crossBlackLayer->line(0)->clear(); _crossBlackLayer->line(1)->clear(); _crossBlackLayer->unlock(); _crossGrayLayer->lockDelayPainting(); _crossGrayLayer->clear(); _crossGrayLayer->unlock(); KminSolver kminSolver(_stations); bool ok=true; _kmin=kminSolver.calculate(ok); if(ok && _kmin>0.0) { _kmaxSolver=new KmaxSolver(_stations, _kmin); connect(&_kmaxTimer, SIGNAL(timeout()), this, SLOT(setTemporaryKmax())); connect(_kmaxSolver, SIGNAL(finished()), this, SLOT(setComputedKmax())); _kmaxSolver->calculate(); _kmaxTimer.start(1000); } else { _comments->setText(tr("Error computing kmin (linear array?)")); _comments->update(); } setAzimuth(waveNum.azimuthSpin->value()); waveNum.kminSpin->setValue(_kmin); setKmin(_kmin); }
void ArrayGui::ArrayResponse::setAzimuth | ( | double | azimuth | ) | [slot] |
References QGpCoreWave::TheoreticalLinearFK::angle(), QGpCoreTools::Curve< pointType >::append(), QGpCoreTools::Curve< pointType >::clear(), QGpCoreTools::Angle::cos(), SciFigs::GraphContentLayer::deepUpdate(), kmax(), SciFigs::LineLayer::line(), SciFigs::LineLayer::resetLineProperties(), QGpCoreWave::TheoreticalLinearFK::setAzimuth(), QGpCoreTools::Angle::sin(), TRACE, and QGpCoreWave::TheoreticalLinearFK::value().
Referenced by ArrayResponse(), setArray(), setKmax(), and setKmin().
{ TRACE; LayerLocker lla(_directionLayer); Curve<Point2D>& azLine1=static_cast<PlotLine2D *>(_directionLayer->line(0) )->curve(); Curve<Point2D>& azLine2=static_cast<PlotLine2D *>(_directionLayer->line(1) )->curve(); double kminHalf=0.5 * waveNum.kminSpin->value(); double kmax=waveNum.kmaxSpin->value(); KminSolver kSolver(_stations); kSolver.setAzimuth(azimuth); azLine1[ 0 ].setX(kminHalf * kSolver.angle().cos()); azLine1[ 0 ].setY(kminHalf * kSolver.angle().sin()); azLine1[ 1 ].setX(kmax * kSolver.angle().cos()); azLine1[ 1 ].setY(kmax * kSolver.angle().sin()); azLine2[ 0 ].setX( -kminHalf * kSolver.angle().cos()); azLine2[ 0 ].setY( -kminHalf * kSolver.angle().sin()); azLine2[ 1 ].setX( -kmax * kSolver.angle().cos()); azLine2[ 1 ].setY( -kmax * kSolver.angle().sin()); // A cross section across grid is slower than a complete recomputation==>as for scan, create a specific layer Curve<Point2D>& crossCurve1=static_cast<PlotLine2D *>(_crossBlackLayer->line(0) )->curve(); Curve<Point2D>& crossCurve2=static_cast<PlotLine2D *>(_crossBlackLayer->line(1) )->curve(); LayerLocker llc(_crossBlackLayer); crossCurve1.clear(); crossCurve2.clear(); double dk=0.005*(kmax-kminHalf); for(double k=-kmax; k < -kminHalf; k+=dk) { crossCurve1.append(Point(k, kSolver.value(k))); } crossCurve1.append(Point(-kminHalf, kSolver.value( -kminHalf) )); for(double k=kminHalf; k < kmax; k+=dk) { crossCurve2.append(Point(k, kSolver.value(k))); } crossCurve2.append(Point(kmax, kSolver.value(kmax) )); _crossBlackLayer->resetLineProperties(); _crossBlackLayer->deepUpdate(); _directionLayer->deepUpdate(); }
void ArrayGui::ArrayResponse::setFrequencySampling | ( | SamplingParameters & | fparam | ) |
void ArrayGui::ArrayResponse::setKmax | ( | double | kmax | ) | [slot] |
References SciFigs::GraphContentLayer::deepUpdate(), kmaxChanged(), SciFigs::CircleViewer::set(), setAzimuth(), and TRACE.
Referenced by ArrayResponse().
{ TRACE; _kmaxTouched=true; _circleLayer->set(1, 0, 0, kmax, kmax, 0.0, Qt::black); _circleLayer->deepUpdate(); emit kmaxChanged(kmax); setAzimuth(waveNum.azimuthSpin->value()); }
void ArrayGui::ArrayResponse::setKmin | ( | double | kmin | ) | [slot] |
References SciFigs::GraphContentLayer::deepUpdate(), kminChanged(), SciFigs::CircleViewer::set(), setAzimuth(), and TRACE.
Referenced by ArrayResponse(), and setArray().
{ TRACE; _circleLayer->set(0, 0, 0, 0.5*kmin, 0.5*kmin, 0.0, Qt::black); _circleLayer->deepUpdate(); emit kminChanged(kmin); setAzimuth(waveNum.azimuthSpin->value()); }