#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());
}