From 5dce0d83843934ec76cc7c72e6e5d9d8ae87a945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20K=C3=B6fferlein?= Date: Sun, 5 Jul 2020 09:42:08 -0700 Subject: [PATCH] Implemented #603 (Coordinates for adjust origin) (#604) --- .../laybasic/AlignCellOptionsDialog.ui | 82 ++++++++++++++++++- src/laybasic/laybasic/layDialogs.cc | 38 +++++++-- src/laybasic/laybasic/layDialogs.h | 18 +++- src/laybasic/laybasic/layLayoutView.cc | 18 ++-- src/laybasic/laybasic/layLayoutView.h | 5 +- .../lay_plugin/layBooleanOperationsDialogs.h | 4 +- 6 files changed, 136 insertions(+), 29 deletions(-) diff --git a/src/laybasic/laybasic/AlignCellOptionsDialog.ui b/src/laybasic/laybasic/AlignCellOptionsDialog.ui index 8e556df7b..fb90dd6ac 100644 --- a/src/laybasic/laybasic/AlignCellOptionsDialog.ui +++ b/src/laybasic/laybasic/AlignCellOptionsDialog.ui @@ -7,7 +7,7 @@ 0 0 432 - 342 + 349 @@ -32,7 +32,7 @@ - Put origin relative to cell's bounding box at ... + Place this cell reference point ... @@ -302,6 +302,79 @@ + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ... at x: + + + + + + + + + + µm, y: + + + + + + + + + + µm + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 5 + + + + @@ -322,7 +395,7 @@ Qt::Vertical - QSizePolicy::Fixed + QSizePolicy::Expanding @@ -403,7 +476,10 @@ lb cb rb + x_le + y_le vis_only_cbx + adjust_calls_cbx diff --git a/src/laybasic/laybasic/layDialogs.cc b/src/laybasic/laybasic/layDialogs.cc index 08715e91e..91d5bb303 100644 --- a/src/laybasic/laybasic/layDialogs.cc +++ b/src/laybasic/laybasic/layDialogs.cc @@ -900,33 +900,39 @@ AlignCellOptionsDialog::~AlignCellOptionsDialog () } bool -AlignCellOptionsDialog::exec_dialog (int &mode_x, int &mode_y, bool &visible_only, bool &adjust_calls) +AlignCellOptionsDialog::exec_dialog (AlignCellOptions &data) { - mp_ui->vis_only_cbx->setChecked (visible_only); - mp_ui->adjust_calls_cbx->setChecked (adjust_calls); + mp_ui->vis_only_cbx->setChecked (data.visible_only); + mp_ui->adjust_calls_cbx->setChecked (data.adjust_parents); QToolButton *buttons[3][3] = { { mp_ui->lb, mp_ui->cb, mp_ui->rb }, { mp_ui->lc, mp_ui->cc, mp_ui->rc }, { mp_ui->lt, mp_ui->ct, mp_ui->rt } }; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { - buttons[i][j]->setChecked (j - 1 == mode_x && i - 1 == mode_y); + buttons[i][j]->setChecked (j - 1 == data.mode_x && i - 1 == data.mode_y); } } + mp_ui->x_le->setText (tl::to_qstring (tl::micron_to_string (data.xpos))); + mp_ui->y_le->setText (tl::to_qstring (tl::micron_to_string (data.ypos))); + if (QDialog::exec ()) { - visible_only = mp_ui->vis_only_cbx->isChecked (); - adjust_calls = mp_ui->adjust_calls_cbx->isChecked (); + data.visible_only = mp_ui->vis_only_cbx->isChecked (); + data.adjust_parents = mp_ui->adjust_calls_cbx->isChecked (); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { if (buttons[i][j]->isChecked ()) { - mode_x = j - 1; - mode_y = i - 1; + data.mode_x = j - 1; + data.mode_y = i - 1; } } } + tl::from_string (tl::to_string (mp_ui->x_le->text ()), data.xpos); + tl::from_string (tl::to_string (mp_ui->y_le->text ()), data.ypos); + return true; } else { @@ -934,7 +940,21 @@ AlignCellOptionsDialog::exec_dialog (int &mode_x, int &mode_y, bool &visible_onl } } -void +void +AlignCellOptionsDialog::accept () +{ +BEGIN_PROTECTED; + + double x = 0.0; + tl::from_string (tl::to_string (mp_ui->x_le->text ()), x); + tl::from_string (tl::to_string (mp_ui->y_le->text ()), x); + + QDialog::accept (); + +END_PROTECTED; +} + +void AlignCellOptionsDialog::button_clicked () { QToolButton *buttons[3][3] = { { mp_ui->lb, mp_ui->cb, mp_ui->rb }, { mp_ui->lc, mp_ui->cc, mp_ui->rc }, { mp_ui->lt, mp_ui->ct, mp_ui->rt } }; diff --git a/src/laybasic/laybasic/layDialogs.h b/src/laybasic/laybasic/layDialogs.h index 2f78430f8..5d471ccab 100644 --- a/src/laybasic/laybasic/layDialogs.h +++ b/src/laybasic/laybasic/layDialogs.h @@ -363,6 +363,21 @@ private: lay::LayoutView *mp_view; }; +/** + * @brief A data structure holding the options for the "align cell" dialog + */ +struct LAYBASIC_PUBLIC AlignCellOptions +{ + AlignCellOptions () + : mode_x (-1), mode_y (-1), xpos (0.0), ypos (0.0), visible_only (false), adjust_parents (true) + { } + + int mode_x, mode_y; + double xpos, ypos; + bool visible_only; + bool adjust_parents; +}; + /** * @brief The merge operation options */ @@ -375,10 +390,11 @@ public: AlignCellOptionsDialog (QWidget *parent); virtual ~AlignCellOptionsDialog (); - bool exec_dialog (int &mode_x, int &mode_y, bool &visible_only, bool &adjust_calls); + bool exec_dialog (AlignCellOptions &data); private slots: void button_clicked (); + void accept (); private: Ui::AlignCellOptionsDialog *mp_ui; diff --git a/src/laybasic/laybasic/layLayoutView.cc b/src/laybasic/laybasic/layLayoutView.cc index 91d0fe807..f7ae519f5 100644 --- a/src/laybasic/laybasic/layLayoutView.cc +++ b/src/laybasic/laybasic/layLayoutView.cc @@ -51,7 +51,6 @@ #include "layConverters.h" #include "layGridNet.h" #include "layMove.h" -#include "layDialogs.h" #include "layZoomBox.h" #include "layMouseTracker.h" #include "layTipDialog.h" @@ -463,10 +462,6 @@ LayoutView::init (db::Manager *mgr, QWidget * /*parent*/) m_sel_inside_pcells = false; m_move_to_origin_mode_x = 0; m_move_to_origin_mode_y = 0; - m_align_cell_origin_mode_x = -1; - m_align_cell_origin_mode_y = -1; - m_align_cell_origin_visible_layers = false; - m_align_cell_adjust_parents = true; m_del_cell_mode = 0; m_layer_hier_mode = 0; m_add_other_layers = false; @@ -5292,7 +5287,7 @@ LayoutView::cm_align_cell_origin () } lay::AlignCellOptionsDialog dialog (this); - if (dialog.exec_dialog (m_align_cell_origin_mode_x, m_align_cell_origin_mode_y, m_align_cell_origin_visible_layers, m_align_cell_adjust_parents)) { + if (dialog.exec_dialog (m_align_cell_options)) { clear_selection (); @@ -5300,7 +5295,7 @@ LayoutView::cm_align_cell_origin () db::Box bbox; - if (m_align_cell_origin_visible_layers) { + if (m_align_cell_options.visible_only) { for (lay::LayerPropertiesConstIterator l = begin_layers (); !l.at_end (); ++l) { if (! l->has_children () && l->layer_index () >= 0 && l->cellview_index () == cv_index && l->visible (true /*real*/)) { bbox += cell->bbox (l->layer_index ()); @@ -5311,7 +5306,7 @@ LayoutView::cm_align_cell_origin () } db::Coord refx, refy; - switch (m_align_cell_origin_mode_x) { + switch (m_align_cell_options.mode_x) { case -1: refx = bbox.left (); break; @@ -5322,7 +5317,7 @@ LayoutView::cm_align_cell_origin () refx = bbox.center ().x (); break; } - switch (m_align_cell_origin_mode_y) { + switch (m_align_cell_options.mode_y) { case -1: refy = bbox.bottom (); break; @@ -5334,10 +5329,11 @@ LayoutView::cm_align_cell_origin () break; } - db::Trans t (db::Vector (-refx, -refy)); db::Layout &layout = cellview (cv_index)->layout (); db::Cell &nc_cell = layout.cell (cell->cell_index ()); + db::Trans t (db::Vector (-refx + db::coord_traits::rounded (m_align_cell_options.xpos / layout.dbu ()), -refy + db::coord_traits::rounded (m_align_cell_options.ypos / layout.dbu ()))); + for (unsigned int i = 0; i < layout.layers (); ++i) { if (layout.is_valid_layer (i)) { db::Shapes &shapes = nc_cell.shapes (i); @@ -5351,7 +5347,7 @@ LayoutView::cm_align_cell_origin () nc_cell.transform (*inst, t); } - if (m_align_cell_adjust_parents) { + if (m_align_cell_options.adjust_parents) { std::vector > insts_to_modify; for (db::Cell::parent_inst_iterator pi = nc_cell.begin_parent_insts (); ! pi.at_end (); ++pi) { diff --git a/src/laybasic/laybasic/layLayoutView.h b/src/laybasic/laybasic/layLayoutView.h index 4f3eb3563..fc05c566e 100644 --- a/src/laybasic/laybasic/layLayoutView.h +++ b/src/laybasic/laybasic/layLayoutView.h @@ -50,6 +50,7 @@ #include "layPlugin.h" #include "layDisplayState.h" #include "layBookmarkList.h" +#include "layDialogs.h" #include "gsi.h" #include "tlException.h" #include "tlEvents.h" @@ -2871,9 +2872,7 @@ private: db::LayerProperties m_new_layer_props; db::DVector m_move_dist; int m_move_to_origin_mode_x, m_move_to_origin_mode_y; - int m_align_cell_origin_mode_x, m_align_cell_origin_mode_y; - bool m_align_cell_origin_visible_layers; - bool m_align_cell_adjust_parents; + lay::AlignCellOptions m_align_cell_options; int m_del_cell_mode; int m_layer_hier_mode; int m_duplicate_hier_mode; diff --git a/src/plugins/tools/bool/lay_plugin/layBooleanOperationsDialogs.h b/src/plugins/tools/bool/lay_plugin/layBooleanOperationsDialogs.h index 4010823f4..948553e4f 100644 --- a/src/plugins/tools/bool/lay_plugin/layBooleanOperationsDialogs.h +++ b/src/plugins/tools/bool/lay_plugin/layBooleanOperationsDialogs.h @@ -21,8 +21,8 @@ */ -#ifndef HDR_layDialogs -#define HDR_layDialogs +#ifndef HDR_layBooleanOperationsDialogs +#define HDR_layBooleanOperationsDialogs #include "ui_BooleanOptionsDialog.h" #include "ui_SizingOptionsDialog.h"