diff --git a/src/db/db/dbCommonReader.cc b/src/db/db/dbCommonReader.cc index 15cb0fb2e..7d4a1f1f3 100644 --- a/src/db/db/dbCommonReader.cc +++ b/src/db/db/dbCommonReader.cc @@ -541,31 +541,58 @@ CommonReaderBase::open_dl_uncached (db::Layout &layout, const LDPair &dl) } unsigned int nl = layout.insert_layer (lp); + + // change OASIS layer name if a layer already exists by layer/datatype, but has a different name + if (! lp.name.empty () && layout.get_properties (nl).name != lp.name) { + layout.set_properties (nl, lp); + } + m_layer_map_out.map (dl, nl, lp); m_layers_created.insert (nl); return std::make_pair (true, nl); - } else if (li.size () == 1) { - - m_layer_map_out.map (dl, *li.begin (), layout.get_properties (*li.begin ())); - - return std::make_pair (true, *li.begin ()); - } else { - for (std::set::const_iterator i = li.begin (); i != li.end (); ++i) { - m_layer_map_out.mmap (dl, *i, layout.get_properties (*i)); + for (auto i = li.begin (); i != li.end (); ++i) { + + // change OASIS layer name if a layer exists by layer/datatype, but has a different name + const tl::interval_map *names_dmap = m_layer_names.mapped (dl.layer); + if (names_dmap != 0) { + const std::string *name = names_dmap->mapped (dl.datatype); + if (name != 0) { + db::LayerProperties lp_out = layout.get_properties (*i); + if (lp_out.name != *name) { + lp_out.name = *name; + layout.set_properties (*i, lp_out); + } + } + } + } - std::map, unsigned int>::iterator mmp = m_multi_mapping_placeholders.find (li); - if (mmp == m_multi_mapping_placeholders.end ()) { - // create a placeholder layer - mmp = m_multi_mapping_placeholders.insert (std::make_pair (li, layout.insert_layer ())).first; - } + if (li.size () == 1) { - return std::make_pair (true, mmp->second); + m_layer_map_out.map (dl, *li.begin (), layout.get_properties (*li.begin ())); + + return std::make_pair (true, *li.begin ()); + + } else { + + for (std::set::const_iterator i = li.begin (); i != li.end (); ++i) { + m_layer_map_out.mmap (dl, *i, layout.get_properties (*i)); + } + + std::map, unsigned int>::iterator mmp = m_multi_mapping_placeholders.find (li); + if (mmp == m_multi_mapping_placeholders.end ()) { + // create a placeholder layer + mmp = m_multi_mapping_placeholders.insert (std::make_pair (li, layout.insert_layer ())).first; + } + + return std::make_pair (true, mmp->second); + + } } } diff --git a/src/laybasic/laybasic/layLayerProperties.cc b/src/laybasic/laybasic/layLayerProperties.cc index 1758ad72b..f40066c09 100644 --- a/src/laybasic/laybasic/layLayerProperties.cc +++ b/src/laybasic/laybasic/layLayerProperties.cc @@ -640,6 +640,13 @@ LayerProperties::do_realize (const LayoutViewBase *view) const } + if (m_layer_index >= 0) { + const auto &lp = cv->layout ().get_properties (m_layer_index); + if (! lp.name.empty () && m_source_real.name () != lp.name) { + m_source_real.name (lp.name); + } + } + } } diff --git a/src/laybasic/laybasic/layLayoutViewBase.cc b/src/laybasic/laybasic/layLayoutViewBase.cc index d893ea79b..0a07c65cc 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.cc +++ b/src/laybasic/laybasic/layLayoutViewBase.cc @@ -3383,6 +3383,7 @@ LayoutViewBase::reload_layout (unsigned int cv_index) } set_properties (new_props); + do_update_layer_sources (); goto_view (state); } diff --git a/src/plugins/streamers/lstream/unit_tests/dbLStreamReaderTests.cc b/src/plugins/streamers/lstream/unit_tests/dbLStreamReaderTests.cc index 6c4a92d2b..5ce038752 100644 --- a/src/plugins/streamers/lstream/unit_tests/dbLStreamReaderTests.cc +++ b/src/plugins/streamers/lstream/unit_tests/dbLStreamReaderTests.cc @@ -131,3 +131,23 @@ TEST(variants) run_test (_this, tl::testdata (), "variants.lstr", "variants_au.oas"); } +TEST(reload_layer_props) +{ + db::LoadLayoutOptions options; + + db::Layout layout; + auto l1 = layout.insert_layer (db::LayerProperties (1, 0, "A")); + auto l2 = layout.insert_layer (db::LayerProperties (2, 0, "B")); + + { + std::string fn (tl::testdata ()); + fn += "/lstream/layers.lstr"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (layout, options); + } + + // layer 1 got renamed + EXPECT_EQ (layout.get_properties (l1).to_string (), "ONE (1/0)"); + EXPECT_EQ (layout.get_properties (l2).to_string (), "B (2/0)"); +} diff --git a/testdata/lstream/layers.lstr b/testdata/lstream/layers.lstr new file mode 100644 index 000000000..0bc26c5c0 Binary files /dev/null and b/testdata/lstream/layers.lstr differ