diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25View.cc b/src/plugins/tools/view_25d/lay_plugin/layD25View.cc index 9a1b29c2b..3bb50cbc8 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25View.cc +++ b/src/plugins/tools/view_25d/lay_plugin/layD25View.cc @@ -51,6 +51,8 @@ D25View::D25View (QWidget *parent) connect (mp_ui->fit_bottom, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ())); connect (mp_ui->zoom_slider, SIGNAL (valueChanged (int)), this, SLOT (scale_slider_changed (int))); connect (mp_ui->vzoom_slider, SIGNAL (valueChanged (int)), this, SLOT (vscale_slider_changed (int))); + connect (mp_ui->zoom_factor, SIGNAL (editingFinished ()), this, SLOT (scale_value_edited ())); + connect (mp_ui->vzoom_factor, SIGNAL (editingFinished ()), this, SLOT (vscale_value_edited ())); connect (mp_ui->d25_view, SIGNAL (scale_factor_changed (double)), this, SLOT (scale_factor_changed (double))); connect (mp_ui->d25_view, SIGNAL (vscale_factor_changed (double)), this, SLOT (vscale_factor_changed (double))); connect (mp_ui->d25_view, SIGNAL (init_failed ()), this, SLOT (init_failed ())); @@ -80,6 +82,34 @@ D25View::init_failed () mp_ui->gl_stack->setCurrentIndex (1); } +void +D25View::scale_value_edited () +{ + double f = mp_ui->d25_view->scale_factor (); + try { + tl::from_string (tl::to_string (mp_ui->zoom_factor->text ()), f); + f = std::min (1e6, std::max (1e-6, f)); + } catch (...) { + // ignore exceptions + } + mp_ui->d25_view->set_scale_factor (f); + scale_factor_changed (f); +} + +void +D25View::vscale_value_edited () +{ + double f = mp_ui->d25_view->vscale_factor (); + try { + tl::from_string (tl::to_string (mp_ui->vzoom_factor->text ()), f); + f = std::min (1e6, std::max (1e-6, f)); + } catch (...) { + // ignore exceptions + } + mp_ui->d25_view->set_vscale_factor (f); + vscale_factor_changed (f); +} + void D25View::scale_slider_changed (int value) { diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25View.h b/src/plugins/tools/view_25d/lay_plugin/layD25View.h index 9e8d7d409..ec06ce1b2 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25View.h +++ b/src/plugins/tools/view_25d/lay_plugin/layD25View.h @@ -58,8 +58,10 @@ private slots: void fit_button_clicked (); void scale_factor_changed (double f); void scale_slider_changed (int value); + void scale_value_edited (); void vscale_factor_changed (double f); void vscale_slider_changed (int value); + void vscale_value_edited (); void init_failed (); private: diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25ViewUtils.cc b/src/plugins/tools/view_25d/lay_plugin/layD25ViewUtils.cc index 0dc1c87a8..a64c78fce 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25ViewUtils.cc +++ b/src/plugins/tools/view_25d/lay_plugin/layD25ViewUtils.cc @@ -117,15 +117,11 @@ hit_point_with_cuboid (const QVector3D &line, const QVector3D &line_dir, const Q double min_dist = 0.0; int min_dist_index = -1; - QVector3D ld_norm = line_dir.normalized (); for (std::vector >::const_iterator i = cutpoints.begin (); i != cutpoints.end (); ++i) { if (i->first) { - double dist = QVector3D::dotProduct (i->second - line, ld_norm); - if (min_dist_index < 0) { - min_dist = dist; - min_dist_index = int (i - cutpoints.begin ()); - } else if (dist < min_dist) { + double dist = QVector3D::dotProduct (i->second - line, line_dir); + if (min_dist_index < 0 || dist < min_dist) { min_dist = dist; min_dist_index = int (i - cutpoints.begin ()); } diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.cc b/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.cc index 846bd1136..13827b08a 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.cc +++ b/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.cc @@ -100,7 +100,7 @@ public: QVector3D yv (-re * xv.z (), cos (view ()->cam_elevation () * M_PI / 180.0), re * xv.x ()); QVector3D drag = xv * dx + yv * dy; - view ()->set_displacement (m_start_displacement + drag / view ()->scale_factor ()); + view ()->set_displacement (m_start_displacement + drag / view ()->scale_factors ()); } private: @@ -366,8 +366,8 @@ D25ViewWidget::hit_point_with_scene (const QVector3D &line_dir) { double min_focus_dist = 0.5; - QVector3D corner = (QVector3D (m_bbox.left (), m_zmin, -(m_bbox.bottom () + m_bbox.height ())) + m_displacement) * m_scale_factor; - QVector3D dim = QVector3D (m_bbox.width (), m_zmax - m_zmin, m_bbox.height ()) * m_scale_factor; + QVector3D corner = (QVector3D (m_bbox.left (), m_zmin, -(m_bbox.bottom () + m_bbox.height ())) + m_displacement) * scale_factors (); + QVector3D dim = QVector3D (m_bbox.width (), m_zmax - m_zmin, m_bbox.height ()) * scale_factors (); QVector3D line = cam_position (); std::pair hp = lay::hit_point_with_cuboid (line, line_dir, corner, dim); diff --git a/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.h b/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.h index 57a07bdb6..1bac29b68 100644 --- a/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.h +++ b/src/plugins/tools/view_25d/lay_plugin/layD25ViewWidget.h @@ -96,6 +96,11 @@ public: refresh (); } + QVector3D scale_factors () const + { + return QVector3D (scale_factor (), scale_factor () * vscale_factor (), scale_factor ()); + } + double scale_factor () const { return m_scale_factor; } void set_scale_factor (double f)