| 2887 | } |
| 2888 | |
| 2889 | void |
| 2890 | LayoutViewBase::add_new_layers (const std::vector <unsigned int> &layer_ids, int cv_index) |
| 2891 | { |
| 2892 | if (cv_index >= 0 && cv_index < int (cellviews ())) { |
| 2893 | |
| 2894 | const lay::CellView &cv = cellview (cv_index); |
| 2895 | |
| 2896 | // create the layers and do a basic recoloring .. |
| 2897 | lay::LayerPropertiesList new_props (get_properties ()); |
| 2898 | |
| 2899 | bool was_empty = new_props.begin_const_recursive ().at_end (); |
| 2900 | |
| 2901 | // don't create new layers for those, for which there are layers already: compute a |
| 2902 | // set of layers already present |
| 2903 | std::set <db::LayerProperties, db::LPLogicalLessFunc> present_layers; |
| 2904 | for (LayerPropertiesConstIterator lay_iter = begin_layers (); ! lay_iter.at_end (); ++lay_iter) { |
| 2905 | if (! lay_iter->has_children () && lay_iter->cellview_index () == cv_index) { |
| 2906 | present_layers.insert (lay_iter->source (true /*real*/).layer_props ()); |
| 2907 | } |
| 2908 | } |
| 2909 | |
| 2910 | // determine layers which are new and need to be created |
| 2911 | std::vector <db::LayerProperties> new_layers; |
| 2912 | for (std::vector <unsigned int>::const_iterator l = layer_ids.begin (); l != layer_ids.end (); ++l) { |
| 2913 | const db::LayerProperties &lp = cv->layout ().get_properties (*l); |
| 2914 | if (present_layers.find (lp) == present_layers.end ()) { |
| 2915 | new_layers.push_back (lp); |
| 2916 | } |
| 2917 | } |
| 2918 | |
| 2919 | // create them in the sorting order provided by db::LayerProperties |
| 2920 | std::sort (new_layers.begin (), new_layers.end (), db::LPLogicalLessFunc ()); |
| 2921 | |
| 2922 | // and actually create them |
| 2923 | for (std::vector <db::LayerProperties>::const_iterator l = new_layers.begin (); l != new_layers.end (); ++l) { |
| 2924 | lay::LayerProperties p; |
| 2925 | p.set_source (lay::ParsedLayerSource (*l, cv_index)); |
| 2926 | init_layer_properties (p, new_props); |
| 2927 | new_props.push_back (p); |
| 2928 | } |
| 2929 | |
| 2930 | set_properties (new_props); |
| 2931 | |
| 2932 | if (was_empty) { |
| 2933 | set_current_layer (new_props.begin_const_recursive ()); |
| 2934 | } |
| 2935 | |
| 2936 | } |
| 2937 | } |
| 2938 | |
| 2939 | void |
| 2940 | LayoutViewBase::init_layer_properties (LayerProperties &p) const |
no test coverage detected