mirror of
https://github.com/KLayout/klayout.git
synced 2026-08-22 05:57:41 +02:00
Implemented new layout dialog with intial layers
Plus small enhancements: the first layer will be selected initially, so you can starting drawing immediately.
This commit is contained in:
@@ -2525,21 +2525,30 @@ MainWindow::cm_new_layout ()
|
|||||||
std::string technology = m_initial_technology;
|
std::string technology = m_initial_technology;
|
||||||
static std::string s_new_cell_cell_name ("TOP");
|
static std::string s_new_cell_cell_name ("TOP");
|
||||||
static double s_new_cell_window_size = 2.0;
|
static double s_new_cell_window_size = 2.0;
|
||||||
|
static std::vector<db::LayerProperties> s_layers;
|
||||||
|
|
||||||
double dbu = 0.0;
|
double dbu = 0.0;
|
||||||
|
|
||||||
lay::NewLayoutPropertiesDialog dialog (this);
|
lay::NewLayoutPropertiesDialog dialog (this);
|
||||||
if (dialog.exec_dialog (technology, s_new_cell_cell_name, dbu, s_new_cell_window_size, m_new_layout_current_panel)) {
|
if (dialog.exec_dialog (technology, s_new_cell_cell_name, dbu, s_new_cell_window_size, s_layers, m_new_layout_current_panel)) {
|
||||||
|
|
||||||
lay::CellViewRef cellview = create_or_load_layout (0, 0, technology, m_new_layout_current_panel ? 2 : 1 /*= new view*/);
|
std::unique_ptr <lay::LayoutHandle> handle (new lay::LayoutHandle (new db::Layout (& manager ()), std::string ()));
|
||||||
|
handle->rename ("new");
|
||||||
|
|
||||||
if (dbu > 1e-10) {
|
if (dbu > 1e-10) {
|
||||||
cellview->layout ().dbu (dbu);
|
handle->layout ().dbu (dbu);
|
||||||
}
|
}
|
||||||
db::cell_index_type new_ci = cellview->layout ().add_cell (s_new_cell_cell_name.empty () ? 0 : s_new_cell_cell_name.c_str ());
|
db::cell_index_type new_ci = handle->layout ().add_cell (s_new_cell_cell_name.empty () ? 0 : s_new_cell_cell_name.c_str ());
|
||||||
cellview.set_cell (new_ci);
|
|
||||||
|
|
||||||
current_view ()->zoom_box_and_set_hier_levels (db::DBox (-0.5 * s_new_cell_window_size, -0.5 * s_new_cell_window_size, 0.5 * s_new_cell_window_size, 0.5 * s_new_cell_window_size), std::make_pair (0, 1));
|
for (std::vector<db::LayerProperties>::const_iterator l = s_layers.begin (); l != s_layers.end (); ++l) {
|
||||||
|
handle->layout ().insert_layer (*l);
|
||||||
|
}
|
||||||
|
|
||||||
|
lay::LayoutView *mp_view = (m_new_layout_current_panel && current_view ()) ? current_view () : view (create_view ());
|
||||||
|
|
||||||
|
unsigned int ci = mp_view->add_layout (handle.release (), true);
|
||||||
|
mp_view->cellview_ref (ci).set_cell (new_ci);
|
||||||
|
mp_view->zoom_box_and_set_hier_levels (db::DBox (-0.5 * s_new_cell_window_size, -0.5 * s_new_cell_window_size, 0.5 * s_new_cell_window_size, 0.5 * s_new_cell_window_size), std::make_pair (0, 1));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1040,7 +1040,7 @@ BEGIN_PROTECTED
|
|||||||
query_to_model (model, lq, iq, std::numeric_limits<size_t>::max (), true);
|
query_to_model (model, lq, iq, std::numeric_limits<size_t>::max (), true);
|
||||||
model.end_changes ();
|
model.end_changes ();
|
||||||
|
|
||||||
std::unique_ptr <lay::LayoutHandle> handle (new lay::LayoutHandle (new db::Layout (), std::string ()));
|
std::unique_ptr <lay::LayoutHandle> handle (new lay::LayoutHandle (new db::Layout (mp_view->manager ()), std::string ()));
|
||||||
handle->rename ("query_results");
|
handle->rename ("query_results");
|
||||||
model.export_layout (handle->layout ());
|
model.export_layout (handle->layout ());
|
||||||
mp_view->add_layout (handle.release (), true);
|
mp_view->add_layout (handle.release (), true);
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>563</width>
|
<width>594</width>
|
||||||
<height>234</height>
|
<height>401</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="3" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="QLineEdit" name="window_le">
|
<widget class="QLineEdit" name="window_le">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
@@ -60,13 +60,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="label_5">
|
|
||||||
<property name="text">
|
|
||||||
<string>Database unit</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2" colspan="3">
|
<item row="1" column="2" colspan="3">
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
@@ -80,13 +73,80 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="2">
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="topcell_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLineEdit" name="dbu_le">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" colspan="4">
|
||||||
|
<widget class="QComboBox" name="tech_cbx"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1" colspan="4">
|
||||||
|
<widget class="QLineEdit" name="layers_le"/>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="4">
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>141</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="2">
|
||||||
<widget class="QLabel" name="label_6">
|
<widget class="QLabel" name="label_6">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>µm</string>
|
<string>µm</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="4" column="2">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>µm</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Top cell</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>Database unit</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Technology</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="3" column="4">
|
<item row="3" column="4">
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
@@ -100,74 +160,34 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="3" column="3">
|
||||||
<widget class="QLineEdit" name="dbu_le">
|
<widget class="QLabel" name="label_7">
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1" colspan="4">
|
|
||||||
<widget class="QComboBox" name="tech_cbx"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Top cell</string>
|
<string> (empty for default)</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="4" column="0">
|
||||||
<widget class="QLineEdit" name="topcell_le">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="text">
|
|
||||||
<string>Technology</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Initial window size</string>
|
<string>Initial window size</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="2">
|
<item row="5" column="0">
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>µm</string>
|
<string>Initial layer(s)</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="4">
|
<item row="6" column="1" colspan="4">
|
||||||
<spacer>
|
<widget class="QLabel" name="label_9">
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>141</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="3">
|
|
||||||
<widget class="QLabel" name="label_7">
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string> (empty for default)</string>
|
<string><html><head/><body>Specify a comma or blank separated list of layers to create in the usual layer notation, e.g. "1/0 2/0 3/0", "metal1 via1 metal2" or "metal1 (1/0) via1 (2/0) metal2 (3/0)"</body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -214,10 +234,12 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
|
<tabstop>tech_cbx</tabstop>
|
||||||
<tabstop>topcell_le</tabstop>
|
<tabstop>topcell_le</tabstop>
|
||||||
<tabstop>dbu_le</tabstop>
|
<tabstop>dbu_le</tabstop>
|
||||||
<tabstop>window_le</tabstop>
|
<tabstop>window_le</tabstop>
|
||||||
<tabstop>buttonBox</tabstop>
|
<tabstop>layers_le</tabstop>
|
||||||
|
<tabstop>current_panel_cb</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ NewLayoutPropertiesDialog::tech_changed ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &cell_name, double &dbu, double &size, bool ¤t_panel)
|
NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &cell_name, double &dbu, double &size, std::vector<db::LayerProperties> &layers, bool ¤t_panel)
|
||||||
{
|
{
|
||||||
mp_ui->tech_cbx->clear ();
|
mp_ui->tech_cbx->clear ();
|
||||||
unsigned int technology_index = 0;
|
unsigned int technology_index = 0;
|
||||||
@@ -151,6 +151,15 @@ NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &ce
|
|||||||
mp_ui->topcell_le->setText (tl::to_qstring (cell_name));
|
mp_ui->topcell_le->setText (tl::to_qstring (cell_name));
|
||||||
mp_ui->current_panel_cb->setChecked (current_panel);
|
mp_ui->current_panel_cb->setChecked (current_panel);
|
||||||
|
|
||||||
|
std::string layer_string;
|
||||||
|
for (std::vector<db::LayerProperties>::const_iterator l = layers.begin (); l != layers.end (); ++l) {
|
||||||
|
if (l != layers.begin ()) {
|
||||||
|
layer_string += ", ";
|
||||||
|
}
|
||||||
|
layer_string += l->to_string ();
|
||||||
|
}
|
||||||
|
mp_ui->layers_le->setText (tl::to_qstring (layer_string));
|
||||||
|
|
||||||
if (QDialog::exec ()) {
|
if (QDialog::exec ()) {
|
||||||
|
|
||||||
// get the selected technology name
|
// get the selected technology name
|
||||||
@@ -167,8 +176,24 @@ NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &ce
|
|||||||
} else {
|
} else {
|
||||||
dbu = 0.0;
|
dbu = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell_name = tl::to_string (mp_ui->topcell_le->text ());
|
cell_name = tl::to_string (mp_ui->topcell_le->text ());
|
||||||
current_panel = mp_ui->current_panel_cb->isChecked ();
|
current_panel = mp_ui->current_panel_cb->isChecked ();
|
||||||
|
|
||||||
|
layers.clear ();
|
||||||
|
layer_string = tl::to_string (mp_ui->layers_le->text ());
|
||||||
|
tl::Extractor ex (layer_string.c_str ());
|
||||||
|
while (! ex.at_end ()) {
|
||||||
|
db::LayerProperties lp;
|
||||||
|
try {
|
||||||
|
lp.read (ex);
|
||||||
|
} catch (...) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
layers.push_back (lp);
|
||||||
|
ex.test (",");
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ public:
|
|||||||
NewLayoutPropertiesDialog (QWidget *parent);
|
NewLayoutPropertiesDialog (QWidget *parent);
|
||||||
virtual ~NewLayoutPropertiesDialog ();
|
virtual ~NewLayoutPropertiesDialog ();
|
||||||
|
|
||||||
bool exec_dialog (std::string &tech_name, std::string &cell_name, double &dbu, double &window_size, bool ¤t_panel);
|
bool exec_dialog (std::string &tech_name, std::string &cell_name, double &dbu, double &window_size, std::vector<db::LayerProperties> &layers, bool ¤t_panel);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void tech_changed ();
|
void tech_changed ();
|
||||||
|
|||||||
@@ -2859,6 +2859,8 @@ LayoutView::add_new_layers (const std::vector <unsigned int> &layer_ids, int cv_
|
|||||||
// create the layers and do a basic recoloring ..
|
// create the layers and do a basic recoloring ..
|
||||||
lay::LayerPropertiesList new_props (get_properties ());
|
lay::LayerPropertiesList new_props (get_properties ());
|
||||||
|
|
||||||
|
bool was_empty = new_props.begin_const_recursive ().at_end ();
|
||||||
|
|
||||||
// don't create new layers for those, for which there are layers already: compute a
|
// don't create new layers for those, for which there are layers already: compute a
|
||||||
// set of layers already present
|
// set of layers already present
|
||||||
std::set <db::LayerProperties, db::LPLogicalLessFunc> present_layers;
|
std::set <db::LayerProperties, db::LPLogicalLessFunc> present_layers;
|
||||||
@@ -2890,6 +2892,10 @@ LayoutView::add_new_layers (const std::vector <unsigned int> &layer_ids, int cv_
|
|||||||
|
|
||||||
set_properties (new_props);
|
set_properties (new_props);
|
||||||
|
|
||||||
|
if (was_empty) {
|
||||||
|
set_current_layer (new_props.begin_const_recursive ());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3291,6 +3297,18 @@ LayoutView::add_layout (lay::LayoutHandle *layout_handle, bool add_cellview, boo
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// select the first layer if nothing else is selected
|
||||||
|
if (cv_index == 0 && ! mp_control_panel->has_selection ()) {
|
||||||
|
const lay::LayerPropertiesList &lp = get_properties ();
|
||||||
|
lay::LayerPropertiesConstIterator li = lp.begin_const_recursive ();
|
||||||
|
while (! li.at_end () && li->has_children ()) {
|
||||||
|
++li;
|
||||||
|
}
|
||||||
|
if (! li.at_end ()) {
|
||||||
|
mp_control_panel->set_current_layer (li);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// signal to any observers
|
// signal to any observers
|
||||||
file_open_event ();
|
file_open_event ();
|
||||||
|
|
||||||
@@ -3456,6 +3474,18 @@ LayoutView::load_layout (const std::string &filename, const db::LoadLayoutOption
|
|||||||
// create the initial layer properties
|
// create the initial layer properties
|
||||||
create_initial_layer_props (cv_index, lyp_file, add_other_layers);
|
create_initial_layer_props (cv_index, lyp_file, add_other_layers);
|
||||||
|
|
||||||
|
// select the first layer if nothing else is selected
|
||||||
|
if (cv_index == 0 && ! mp_control_panel->has_selection ()) {
|
||||||
|
const lay::LayerPropertiesList &lp = get_properties ();
|
||||||
|
lay::LayerPropertiesConstIterator li = lp.begin_const_recursive ();
|
||||||
|
while (! li.at_end () && li->has_children ()) {
|
||||||
|
++li;
|
||||||
|
}
|
||||||
|
if (! li.at_end ()) {
|
||||||
|
mp_control_panel->set_current_layer (li);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// signal to any observers
|
// signal to any observers
|
||||||
file_open_event ();
|
file_open_event ();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user