diff --git a/src/laybasic/laybasic/layDialogs.cc b/src/laybasic/laybasic/layDialogs.cc index 4dcd62e0b..044aa523f 100644 --- a/src/laybasic/laybasic/layDialogs.cc +++ b/src/laybasic/laybasic/layDialogs.cc @@ -638,7 +638,7 @@ ClearLayerModeDialog::~ClearLayerModeDialog () } bool -ClearLayerModeDialog::exec_dialog (int &clear_mode, const lay::CellView & /*cv*/) +ClearLayerModeDialog::exec_dialog (int &clear_mode) { QRadioButton *buttons [3] = { local_rb, hierarchically_rb, layout_rb }; diff --git a/src/laybasic/laybasic/layDialogs.h b/src/laybasic/laybasic/layDialogs.h index 1c787b3ee..266e08366 100644 --- a/src/laybasic/laybasic/layDialogs.h +++ b/src/laybasic/laybasic/layDialogs.h @@ -261,7 +261,7 @@ public: * * The mode is either 0 (for locally), 1 (for hierarchically) and 2 (for all) */ - bool exec_dialog (int &clear_mode, const lay::CellView &cv); + bool exec_dialog (int &clear_mode); }; /** diff --git a/src/laybasic/laybasic/layLayoutView.cc b/src/laybasic/laybasic/layLayoutView.cc index 2a5a65ffc..490b40303 100644 --- a/src/laybasic/laybasic/layLayoutView.cc +++ b/src/laybasic/laybasic/layLayoutView.cc @@ -6930,46 +6930,46 @@ LayoutView::cm_delete_layer () void LayoutView::cm_clear_layer () { - int layer_index = -1; - int cv_index = -1; - - lay::LayerPropertiesConstIterator sel = current_layer (); - if (! sel.is_null ()) { - if (!sel->has_children () && sel->layer_index () >= 0 && cellview (sel->cellview_index ()).is_valid ()) { - layer_index = int (sel->layer_index ()); - cv_index = int (sel->cellview_index ()); - } - } - - const lay::CellView &cv = cellview (cv_index); - if (! cv.is_valid ()) { - return; + std::vector sel = selected_layers (); + if (sel.empty ()) { + throw tl::Exception (tl::to_string (QObject::tr ("No layer selected for clearing"))); } lay::ClearLayerModeDialog mode_dialog (this); - if (mode_dialog.exec_dialog (m_layer_hier_mode, cv)) { + if (mode_dialog.exec_dialog (m_layer_hier_mode)) { cancel_edits (); clear_selection (); if (manager ()) { - manager ()->transaction (tl::to_string (QObject::tr ("Clear layer"))); + manager ()->transaction (tl::to_string (QObject::tr ("Clear layer"))); } - if (m_layer_hier_mode == 0) { - cv.cell ()->clear ((unsigned int) layer_index); - } else if (m_layer_hier_mode == 1) { + for (std::vector::const_iterator si = sel.begin (); si != sel.end (); ++si) { - cv.cell ()->clear ((unsigned int) layer_index); + if (! (*si)->has_children () && (*si)->layer_index () >= 0 && cellview ((*si)->cellview_index ()).is_valid ()) { + + int layer_index = (*si)->layer_index (); + const lay::CellView &cv = cellview ((*si)->cellview_index ()); + + if (m_layer_hier_mode == 0) { + cv.cell ()->clear ((unsigned int) layer_index); + } else if (m_layer_hier_mode == 1) { + + cv.cell ()->clear ((unsigned int) layer_index); + + std::set called_cells; + cv.cell ()->collect_called_cells (called_cells); + for (std::set ::const_iterator cc = called_cells.begin (); cc != called_cells.end (); ++cc) { + cv->layout ().cell (*cc).clear ((unsigned int) layer_index); + } + + } else { + cv->layout ().clear_layer ((unsigned int) layer_index); + } - std::set called_cells; - cv.cell ()->collect_called_cells (called_cells); - for (std::set ::const_iterator cc = called_cells.begin (); cc != called_cells.end (); ++cc) { - cv->layout ().cell (*cc).clear ((unsigned int) layer_index); } - } else { - cv->layout ().clear_layer ((unsigned int) layer_index); } if (manager ()) {