mirror of https://github.com/KLayout/klayout.git
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:
parent
da273c8e4b
commit
3a9a7e81fb
|
|
@ -2525,21 +2525,30 @@ MainWindow::cm_new_layout ()
|
|||
std::string technology = m_initial_technology;
|
||||
static std::string s_new_cell_cell_name ("TOP");
|
||||
static double s_new_cell_window_size = 2.0;
|
||||
static std::vector<db::LayerProperties> s_layers;
|
||||
|
||||
double dbu = 0.0;
|
||||
|
||||
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) {
|
||||
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 ());
|
||||
cellview.set_cell (new_ci);
|
||||
db::cell_index_type new_ci = handle->layout ().add_cell (s_new_cell_cell_name.empty () ? 0 : s_new_cell_cell_name.c_str ());
|
||||
|
||||
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);
|
||||
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");
|
||||
model.export_layout (handle->layout ());
|
||||
mp_view->add_layout (handle.release (), true);
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>563</width>
|
||||
<height>234</height>
|
||||
<width>594</width>
|
||||
<height>401</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="3" column="1">
|
||||
<item row="4" column="1">
|
||||
<widget class="QLineEdit" name="window_le">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
|
|
@ -60,13 +60,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</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">
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
|
|
@ -80,13 +73,80 @@
|
|||
</property>
|
||||
</spacer>
|
||||
</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">
|
||||
<property name="text">
|
||||
<string>µm</string>
|
||||
</property>
|
||||
</widget>
|
||||
</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">
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
|
|
@ -100,74 +160,34 @@
|
|||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="2" 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="1" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<item row="3" column="3">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Top cell</string>
|
||||
<string> (empty for default)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<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="0" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Technology</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Initial window size</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>µm</string>
|
||||
<string>Initial layer(s)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" 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="2" column="3">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<item row="6" column="1" colspan="4">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<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>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
@ -214,10 +234,12 @@
|
|||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>tech_cbx</tabstop>
|
||||
<tabstop>topcell_le</tabstop>
|
||||
<tabstop>dbu_le</tabstop>
|
||||
<tabstop>window_le</tabstop>
|
||||
<tabstop>buttonBox</tabstop>
|
||||
<tabstop>layers_le</tabstop>
|
||||
<tabstop>current_panel_cb</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections>
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ NewLayoutPropertiesDialog::tech_changed ()
|
|||
}
|
||||
|
||||
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 ();
|
||||
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->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 ()) {
|
||||
|
||||
// get the selected technology name
|
||||
|
|
@ -167,8 +176,24 @@ NewLayoutPropertiesDialog::exec_dialog (std::string &technology, std::string &ce
|
|||
} else {
|
||||
dbu = 0.0;
|
||||
}
|
||||
|
||||
cell_name = tl::to_string (mp_ui->topcell_le->text ());
|
||||
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;
|
||||
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -328,7 +328,7 @@ public:
|
|||
NewLayoutPropertiesDialog (QWidget *parent);
|
||||
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:
|
||||
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 ..
|
||||
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
|
||||
// set of layers already present
|
||||
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);
|
||||
|
||||
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
|
||||
file_open_event ();
|
||||
|
||||
|
|
@ -3456,6 +3474,18 @@ LayoutView::load_layout (const std::string &filename, const db::LoadLayoutOption
|
|||
// create the initial layer properties
|
||||
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
|
||||
file_open_event ();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue