mirror of https://github.com/KLayout/klayout.git
Merge pull request #1956 from KLayout/bugfix/issue-1955
Fixing bug #1955
This commit is contained in:
commit
9e98b0de63
|
|
@ -1298,7 +1298,7 @@ AsIfFlatRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const
|
|||
|
||||
// simplified handling for a box
|
||||
db::Box b = bbox ().enlarged (db::Vector (dx, dy));
|
||||
return region_from_box (b, properties_repository (), begin ()->prop_id ());
|
||||
return region_from_box (b, properties_repository (), db::RegionIterator (begin ()).prop_id ());
|
||||
|
||||
} else if (! merged_semantics () || is_merged ()) {
|
||||
|
||||
|
|
@ -1478,13 +1478,13 @@ AsIfFlatRegion::and_with (const Region &other, PropertyConstraint property_const
|
|||
|
||||
} else if (is_box () && other.is_box ()) {
|
||||
|
||||
if (pc_skip (property_constraint) || pc_match (property_constraint, begin ()->prop_id (), other.begin ().prop_id ())) {
|
||||
if (pc_skip (property_constraint) || pc_match (property_constraint, db::RegionIterator (begin ()).prop_id (), other.begin ().prop_id ())) {
|
||||
|
||||
// Simplified handling for boxes
|
||||
db::Box b = bbox ();
|
||||
b &= other.bbox ();
|
||||
|
||||
db::properties_id_type prop_id_out = pc_norm (property_constraint, begin ()->prop_id ());
|
||||
db::properties_id_type prop_id_out = pc_norm (property_constraint, db::RegionIterator (begin ()).prop_id ());
|
||||
|
||||
return region_from_box (b, properties_repository (), prop_id_out);
|
||||
|
||||
|
|
@ -1494,7 +1494,7 @@ AsIfFlatRegion::and_with (const Region &other, PropertyConstraint property_const
|
|||
|
||||
} else if (is_box () && ! other.strict_handling ()) {
|
||||
|
||||
db::properties_id_type self_prop_id = pc_skip (property_constraint) ? 0 : begin ()->prop_id ();
|
||||
db::properties_id_type self_prop_id = pc_skip (property_constraint) ? 0 : db::RegionIterator (begin ()).prop_id ();
|
||||
|
||||
// map AND with box to clip ..
|
||||
db::Box b = bbox ();
|
||||
|
|
|
|||
|
|
@ -784,7 +784,6 @@ RegionDelegate *
|
|||
DeepRegion::and_with (const Region &other, PropertyConstraint property_constraint) const
|
||||
{
|
||||
const DeepRegion *other_deep = dynamic_cast <const DeepRegion *> (other.delegate ());
|
||||
|
||||
if (empty ()) {
|
||||
|
||||
return clone ()->remove_properties (pc_remove (property_constraint));
|
||||
|
|
|
|||
|
|
@ -31,6 +31,9 @@
|
|||
namespace db
|
||||
{
|
||||
|
||||
template <class T>
|
||||
class generic_shape_iterator;
|
||||
|
||||
template <class T>
|
||||
class DB_PUBLIC generic_shape_iterator_delegate_base
|
||||
{
|
||||
|
|
@ -40,6 +43,9 @@ public:
|
|||
generic_shape_iterator_delegate_base () { }
|
||||
virtual ~generic_shape_iterator_delegate_base () { }
|
||||
|
||||
protected:
|
||||
friend class generic_shape_iterator<T>;
|
||||
|
||||
virtual void do_reset (const db::Box & /*region*/, bool /*overlapping*/) { }
|
||||
virtual db::Box bbox () const { return db::Box::world (); }
|
||||
virtual bool is_addressable () const = 0;
|
||||
|
|
@ -62,6 +68,7 @@ public:
|
|||
: m_iter (from), m_from (from), m_to (to)
|
||||
{ }
|
||||
|
||||
protected:
|
||||
virtual bool is_addressable () const
|
||||
{
|
||||
return addressable;
|
||||
|
|
@ -122,6 +129,7 @@ public:
|
|||
: m_iter (from), m_from (from)
|
||||
{ }
|
||||
|
||||
protected:
|
||||
virtual bool is_addressable () const
|
||||
{
|
||||
return addressable;
|
||||
|
|
@ -185,6 +193,7 @@ public:
|
|||
set ();
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual bool is_addressable () const
|
||||
{
|
||||
return m_is_addressable;
|
||||
|
|
|
|||
|
|
@ -1498,6 +1498,36 @@ class DBRegion_TestClass < TestBase
|
|||
|
||||
end
|
||||
|
||||
# issue #1955 (locking of layout object inside DSS)
|
||||
def test_issue1955
|
||||
|
||||
ly = RBA::Layout::new
|
||||
top = ly.create_cell("TOP")
|
||||
l1 = ly.layer(1, 0)
|
||||
|
||||
dss = RBA::DeepShapeStore::new
|
||||
|
||||
rr = RBA::Region::new(RBA::Box::new(100, 100, 1100, 1100))
|
||||
|
||||
r = RBA::Region::new(top.begin_shapes_rec(l1), dss)
|
||||
r += RBA::Region::new(RBA::Box::new(0, 0, 1000, 1000))
|
||||
|
||||
# this spoils the dss object, if
|
||||
# 1. the first region is a deep region
|
||||
# 2. the second region is a flat region
|
||||
# 3. both regions are boxes
|
||||
# after this operation, bounding boxes are no
|
||||
# longer updated inside the DSS.
|
||||
randrr = r & rr
|
||||
assert_equal(randrr.to_s, "(100,100;100,1000;1000,1000;1000,100)")
|
||||
|
||||
r += RBA::Region::new(RBA::Box::new(1000, 1000, 2000, 2000))
|
||||
|
||||
assert_equal(r.to_s, "(0,0;0,1000;1000,1000;1000,0);(1000,1000;1000,2000;2000,2000;2000,1000)")
|
||||
assert_equal(r.bbox.to_s, "(0,0;2000,2000)")
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
load("test_epilogue.rb")
|
||||
|
|
|
|||
Loading…
Reference in New Issue