Skip to content

Commit

Permalink
add <ctrl> + x
Browse files Browse the repository at this point in the history
recale x-axis from first non-zero to last non-zero
yaxis also scaled.
tskille committed Mar 27, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 46b9649 commit 95bacaf
Showing 7 changed files with 214 additions and 0 deletions.
42 changes: 42 additions & 0 deletions appl/smry_appl.cpp
Original file line number Diff line number Diff line change
@@ -2077,6 +2077,10 @@ bool SmryAppl::eventFilter ( QObject *object, QEvent *event )

return true;

} else if ( keyEvent->key() == Qt::Key_X && m_ctrl_key && !m_shift_key && !m_alt_key ) {

this->calc_min_xrange();

} else if ( keyEvent->key() == Qt::Key_C && m_ctrl_key && !m_shift_key && !m_alt_key ) {

this->copy_to_clipboard();
@@ -2331,6 +2335,37 @@ bool SmryAppl::eventFilter ( QObject *object, QEvent *event )
return false;
}

void SmryAppl::calc_min_xrange()
{
auto chart_series = this->get_smry_series(chart_ind);

if (chart_series.size() > 0) {

auto min_max_dt = chart_series[0]->get_nonzero_range();

QDateTime dt_min_x = std::get<0>(min_max_dt);
QDateTime dt_max_x = std::get<1>(min_max_dt);

for (size_t n = 1; n < chart_series.size(); n++) {

min_max_dt = chart_series[0]->get_nonzero_range();

if (std::get<0>(min_max_dt) < dt_min_x)
dt_min_x = std::get<0>(min_max_dt);

if (std::get<1>(min_max_dt) > dt_max_x)
dt_max_x = std::get<1>(min_max_dt);
}

auto xaxis = this->get_smry_xaxis(chart_ind);

xaxis->setRange(dt_min_x, dt_max_x);

auto min_max_range = axisX[chart_ind]->get_xrange();
update_all_yaxis(min_max_range, chart_ind);
}
}


void SmryAppl::switch_markes()
{
@@ -2659,11 +2694,18 @@ void SmryAppl::keyPressEvent ( QKeyEvent *event )
update_all_yaxis(min_max_range, chart_ind, true);
}

else if ( m_smry_loaded && event->key() == Qt::Key_X && m_ctrl_key && !m_shift_key && !m_alt_key ) {

this->calc_min_xrange();
}


else if ( m_smry_loaded && event->key() == Qt::Key_M && m_ctrl_key && !m_shift_key && !m_alt_key ) {

switch_markes();
}


else if ( m_smry_loaded && event->key() == Qt::Key_C && m_ctrl_key && !m_shift_key && !m_alt_key ) {

this->copy_to_clipboard();
2 changes: 2 additions & 0 deletions appl/smry_appl.hpp
Original file line number Diff line number Diff line change
@@ -242,6 +242,8 @@ private slots:
void copy_to_clipboard();
void switch_markes();

void calc_min_xrange();

void update_full_xrange(int chart_index);

void select_first_chart();
51 changes: 51 additions & 0 deletions appl/smry_series.cpp
Original file line number Diff line number Diff line change
@@ -259,6 +259,18 @@ bool SmrySeries::all_values_zero()
return true;
}

bool SmrySeries::all_values_nonzero()
{
auto data = this->pointsVector();

for (size_t n = 0; n < data.size(); n++)
if (data[n].y() == 0.0)
return false;

return true;
}


std::tuple<QDateTime,QDateTime> SmrySeries::get_min_max_dt_range()
{
QDateTime dt_min_utc;
@@ -278,5 +290,44 @@ std::tuple<QDateTime,QDateTime> SmrySeries::get_min_max_dt_range()
return std::make_tuple(dt_min_utc, dt_max_utc);
}

std::tuple<QDateTime,QDateTime> SmrySeries::get_nonzero_range()
{
QDateTime dt_min_utc;
QDateTime dt_max_utc;

dt_min_utc.setTimeSpec(Qt::UTC);
dt_max_utc.setTimeSpec(Qt::UTC);

dt_min_utc.setDate({1970, 1, 1});
dt_min_utc.setTime({0, 0, 0});

dt_max_utc.setDate({1970, 1, 1});
dt_max_utc.setTime({0, 0, 0});

if (this->all_values_nonzero()){
dt_min_utc = dt_min_utc.addMSecs(static_cast<qint64>(m_glob_min_x));
dt_max_utc = dt_max_utc.addMSecs(static_cast<qint64>(m_glob_max_x));

} else {

auto data = this->pointsVector();

int n_from = 0;
int n_to = data.size() - 1;

while (data[n_from].y() == 0.0)
n_from++;

while (data[n_to].y() == 0.0)
n_to--;

dt_min_utc = dt_min_utc.addMSecs(static_cast<qint64>(data[n_from].x()));
dt_max_utc = dt_max_utc.addMSecs(static_cast<qint64>(data[n_to].x()));
}

return std::make_tuple(dt_min_utc, dt_max_utc);
}




4 changes: 4 additions & 0 deletions appl/smry_series.hpp
Original file line number Diff line number Diff line change
@@ -46,7 +46,11 @@ class SmrySeries: public QtCharts::QLineSeries {
std::tuple<double,double> get_min_max_xrange() { return std::make_tuple(m_glob_min_x, m_glob_max_x); };
std::tuple<QDateTime,QDateTime> get_min_max_dt_range(); // { return std::make_tuple(m_glob_min_x, m_glob_max_x); };

std::tuple<QDateTime,QDateTime> get_nonzero_range(); // { return std::make_tuple(m_glob_min_x, m_glob_max_x); };

bool all_values_zero();
bool all_values_nonzero();

void calcMinAndMax();

private slots:
1 change: 1 addition & 0 deletions main.cpp
Original file line number Diff line number Diff line change
@@ -91,6 +91,7 @@ static void printHelp()
std::cout << " <ctrl> + <shift> + r reload data and update all charts \n";
std::cout << " <ctrl> + p create pdf file (open file dialog) \n";
std::cout << " <ctrl> + o open summary file (open file dialog) \n";
std::cout << " <ctrl> + x rescale x axis, from first to last non-zero. y-axis also rescaled \n";
std::cout << " <ctrl> + z rescale value axis, ignore zero \n";
std::cout << " <delete> delete last series active chart \n";
std::cout << " <ctrl> + <delete> delete active chart \n";
48 changes: 48 additions & 0 deletions tests/test_scale_yaxis.cpp
Original file line number Diff line number Diff line change
@@ -35,6 +35,7 @@ private slots:
void test_2b();
void test_2c();
void test_2d();
void test_2e();
};


@@ -333,6 +334,53 @@ void TestQsummary::test_2d()
QVERIFY(abs(yaxis->multiplier() - 1.00) < 1e-6);
}

void TestQsummary::test_2e()
{
std::vector<std::string> fname_list;
fname_list.push_back("../tests/smry_files/NORNE_ATW2013.ESMRY");
fname_list.push_back("../tests/smry_files/NORNE_S1.ESMRY");

auto loaders = QSum::make_loaders(fname_list);

std::vector<SmryAppl::vect_input_type> vect_list_c1;

vect_list_c1 = {
std::make_tuple(0, "WBHP:B-4BH", -1, false),
std::make_tuple(1, "WBHP:B-4BH", -1, false),
};


SmryAppl::input_list_type input_list;

input_list = { std::make_tuple(vect_list_c1, ""),
};

std::unique_ptr<DerivedSmry> derived_smry;

SmryAppl window(fname_list, loaders, input_list, derived_smry);

SmryYaxis* yaxis = window.get_smry_yaxis(0, 0);

float a_min = static_cast<float>(yaxis->min());
float a_max = static_cast<float>(yaxis->max());

QVERIFY(abs(a_min - 0.0) < 1e-6);
QVERIFY(abs(a_max - 300.0) < 1e-6);
QVERIFY(abs(yaxis->multiplier() - 1.00) < 1e-6);

QLineEdit* cmdline = window.get_cmdline();

// Use <ctrl> + X to change x-axis and y-axis range to fit zon-zero data
QTest::keyEvent(QTest::Click, cmdline, Qt::Key_X, Qt::ControlModifier);

a_min = static_cast<float>(yaxis->min());
a_max = static_cast<float>(yaxis->max());

QVERIFY(abs(a_min - 120.0) < 1e-6);
QVERIFY(abs(a_max - 300.0) < 1e-6);
QVERIFY(abs(yaxis->multiplier() - 1.00) < 1e-6);
}


QTEST_MAIN(TestQsummary)

66 changes: 66 additions & 0 deletions tests/test_smry_appl.cpp
Original file line number Diff line number Diff line change
@@ -45,6 +45,7 @@ private slots:
void test_reload_1();
void test_reload_2();
void test_reload_3();
void test_scale_axis_ctrl_x();
};

const int max_number_of_charts = 2000;
@@ -604,6 +605,71 @@ void TestQsummary::test_scale_axis_vect_opt()
}



void TestQsummary::test_scale_axis_ctrl_x()
{
SmryAppl::input_list_type input_charts;
SmryAppl::loader_list_type loaders;

int num_files = 2;

std::vector<std::string> fname_list;
std::vector<FileType> file_type;

file_type.resize(num_files);
fname_list.resize(num_files);

fname_list[0] = "../tests/smry_files/NORNE_ATW2013.ESMRY";
fname_list[1] = "../tests/smry_files/NORNE_S1.ESMRY";

file_type = { FileType::ESMRY, FileType::ESMRY };

std::string smry_vect = "WBHP:B-4H";
std::string xrange_str = "";

// -----

std::unordered_map<int, std::unique_ptr<Opm::EclIO::ESmry>> esmry_loader;
std::unordered_map<int, std::unique_ptr<Opm::EclIO::ExtESmry>> ext_smry_loader;
std::vector<std::filesystem::path> smry_files;

// set up loaders and smry file system paths
smry_input(fname_list, file_type, esmry_loader, ext_smry_loader, smry_files);

// set up input_charts data type
QSum::chart_input_from_string(smry_vect, input_charts, file_type, esmry_loader, ext_smry_loader, max_number_of_charts, xrange_str);

// make loaders for smryAppl
loaders = std::make_tuple(smry_files, file_type, std::move(esmry_loader), std::move(ext_smry_loader));

// derived summary object for smryAP
std::unique_ptr<DerivedSmry> derived_smry;

SmryAppl window(fname_list, loaders, input_charts, derived_smry);

window.resize(1400, 700);


QCOMPARE(window.number_of_charts(), 1);

QtCharts::QChart* chart = window.get_chart(0);

QRectF plota = chart->plotArea();

SmryXaxis* xaxis = window.get_smry_xaxis(0);
SmryYaxis* yaxis = window.get_smry_yaxis(0, 0);

QCOMPARE(chk_date_range(xaxis, 1997, 11, 7, 2006, 12, 1), true);
QCOMPARE(chk_yaxis_val_range(yaxis, 0.0, 300.0), true);

// Use <ctrl> + X to change x-axis and y-axis range to fit zon-zero data
QTest::keyEvent(QTest::Click, &window, Qt::Key_X, Qt::ControlModifier);

QCOMPARE(chk_date_range(xaxis, 1998, 5, 1, 2001, 5, 31), true);
QCOMPARE(chk_yaxis_val_range(yaxis, 170.0, 240.0), true);
}


void TestQsummary::test_scale_axis_interactive_1()
{
SmryAppl::input_list_type input_charts;

0 comments on commit 95bacaf

Please sign in to comment.