From 78b62e13d1f99124f503e5920ed792fdf74e06c1 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 1 Dec 2025 18:26:22 +0100 Subject: [PATCH] Handling of guiding shape layers - prevent the properties dialogs from changing it --- src/edt/edt/edtPropertiesPageUtils.cc | 7 ++++++- src/edt/edt/edtPropertiesPageUtils.h | 2 ++ src/edt/edt/edtPropertiesPages.cc | 14 ++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/edt/edt/edtPropertiesPageUtils.cc b/src/edt/edt/edtPropertiesPageUtils.cc index b79b56b78..89cc47dcf 100644 --- a/src/edt/edt/edtPropertiesPageUtils.cc +++ b/src/edt/edt/edtPropertiesPageUtils.cc @@ -129,12 +129,17 @@ ChangeLayerApplicator::ChangeLayerApplicator (unsigned int cv_index, unsigned in db::Shape ChangeLayerApplicator::do_apply (db::Shapes & /*shapes*/, const db::Shape &shape, double /*dbu*/, unsigned int cv_index, unsigned int layer, bool /*relative*/) const { db::Shape s = shape; - if (m_cv_index == cv_index && layer != m_new_layer) { + if (m_cv_index == cv_index && layer != m_new_layer && m_skipped_layers.find (layer) == m_skipped_layers.end ()) { s.set_layer (m_new_layer); } return s; } +void ChangeLayerApplicator::skip_layer (unsigned int l) +{ + m_skipped_layers.insert (l); +} + // ------------------------------------------------------------------------- // BoxDimensionsChangeApplicator implementation diff --git a/src/edt/edt/edtPropertiesPageUtils.h b/src/edt/edt/edtPropertiesPageUtils.h index 723e05f7d..ea724e763 100644 --- a/src/edt/edt/edtPropertiesPageUtils.h +++ b/src/edt/edt/edtPropertiesPageUtils.h @@ -125,9 +125,11 @@ public: bool supports_relative_mode () const { return false; } db::Shape do_apply (db::Shapes &shapes, const db::Shape &shape, double dbu, unsigned int cv_index, unsigned int layer, bool relative) const; + void skip_layer (unsigned int l); private: unsigned int m_cv_index, m_new_layer; + std::set m_skipped_layers; }; /** diff --git a/src/edt/edt/edtPropertiesPages.cc b/src/edt/edt/edtPropertiesPages.cc index b538775f6..cb43c96e5 100644 --- a/src/edt/edt/edtPropertiesPages.cc +++ b/src/edt/edt/edtPropertiesPages.cc @@ -281,7 +281,10 @@ ShapePropertiesPage::do_apply (bool current_only, bool relative, bool commit) int new_layer = layer_selector ()->current_layer (); if (new_layer >= 0 && int (pos->layer ()) != new_layer) { - applicator.reset (new CombinedChangeApplicator (applicator.release (), new ChangeLayerApplicator (cv_index, (unsigned int) new_layer))); + unsigned int gs_layer = cv->layout ().guiding_shape_layer (); + ChangeLayerApplicator *cla = new ChangeLayerApplicator (cv_index, (unsigned int) new_layer); + cla->skip_layer (gs_layer); + applicator.reset (new CombinedChangeApplicator (applicator.release (), cla)); } } @@ -425,10 +428,17 @@ ShapePropertiesPage::update_shape () const lay::CellView &cv = view ()->cellview (pos->cv_index ()); double dbu = cv->layout ().dbu (); + unsigned int gs_layer = cv->layout ().guiding_shape_layer (); m_enable_cb_callback = false; layer_selector ()->set_view (view (), pos->cv_index (), true); - layer_selector ()->set_current_layer (pos->layer ()); + if (pos->layer () == gs_layer) { + layer_selector ()->setEnabled (false); + layer_selector ()->set_current_layer (-1); + } else { + layer_selector ()->setEnabled (true); + layer_selector ()->set_current_layer (pos->layer ()); + } m_enable_cb_callback = true; std::string cell_str;