mirror of https://github.com/KLayout/klayout.git
Added GSI tests.
This commit is contained in:
parent
f6107e0686
commit
737e12d6a4
|
|
@ -1673,7 +1673,7 @@ CODE
|
||||||
# @name interacting
|
# @name interacting
|
||||||
# @brief Selects shapes or regions of self which touch or overlap shapes from the other region
|
# @brief Selects shapes or regions of self which touch or overlap shapes from the other region
|
||||||
# @synopsis layer.interacting(other)
|
# @synopsis layer.interacting(other)
|
||||||
# @synopsis layer.interacting(other, count)
|
# @synopsis layer.interacting(other, min_count)
|
||||||
# @synopsis layer.interacting(other, min_count, max_count)
|
# @synopsis layer.interacting(other, min_count, max_count)
|
||||||
# @synopsis layer.interacting(other, min_count .. max_count)
|
# @synopsis layer.interacting(other, min_count .. max_count)
|
||||||
# This method selects all shapes or regions from self which touch or overlap shapes from the other
|
# This method selects all shapes or regions from self which touch or overlap shapes from the other
|
||||||
|
|
@ -1694,7 +1694,7 @@ CODE
|
||||||
# @/tr
|
# @/tr
|
||||||
# @/table
|
# @/table
|
||||||
#
|
#
|
||||||
# If a single count is given, shapes from self are selected only if they do interact with the given
|
# If a single count is given, shapes from self are selected only if they do interact at least with the given
|
||||||
# number of (different) shapes from the other layer. If a min and max count is given, shapes from
|
# number of (different) shapes from the other layer. If a min and max count is given, shapes from
|
||||||
# self are selected only if they interact with min_count or more, but a maximum of max_count different shapes
|
# self are selected only if they interact with min_count or more, but a maximum of max_count different shapes
|
||||||
# from the other layer. Two polygons overlapping or touching at two locations are counted as single interactions.
|
# from the other layer. Two polygons overlapping or touching at two locations are counted as single interactions.
|
||||||
|
|
@ -1709,7 +1709,7 @@ CODE
|
||||||
# @name not_interacting
|
# @name not_interacting
|
||||||
# @brief Selects shapes or regions of self which do not touch or overlap shapes from the other region
|
# @brief Selects shapes or regions of self which do not touch or overlap shapes from the other region
|
||||||
# @synopsis layer.not_interacting(other)
|
# @synopsis layer.not_interacting(other)
|
||||||
# @synopsis layer.not_interacting(other, count)
|
# @synopsis layer.not_interacting(other, min_count)
|
||||||
# @synopsis layer.not_interacting(other, min_count, max_count)
|
# @synopsis layer.not_interacting(other, min_count, max_count)
|
||||||
# @synopsis layer.not_interacting(other, min_count .. max_count)
|
# @synopsis layer.not_interacting(other, min_count .. max_count)
|
||||||
# This method selects all shapes or regions from self which do not touch or overlap shapes from the other
|
# This method selects all shapes or regions from self which do not touch or overlap shapes from the other
|
||||||
|
|
@ -1730,7 +1730,7 @@ CODE
|
||||||
# @/tr
|
# @/tr
|
||||||
# @/table
|
# @/table
|
||||||
#
|
#
|
||||||
# If a single count is given, shapes from self are selected only if they do not interact with the given
|
# If a single count is given, shapes from self are selected only if they interact with less than the given
|
||||||
# number of (different) shapes from the other layer. If a min and max count is given, shapes from
|
# number of (different) shapes from the other layer. If a min and max count is given, shapes from
|
||||||
# self are selected only if they interact with less than min_count or more than max_count different shapes
|
# self are selected only if they interact with less than min_count or more than max_count different shapes
|
||||||
# from the other layer. Two polygons overlapping or touching at two locations are counted as single interactions.
|
# from the other layer. Two polygons overlapping or touching at two locations are counted as single interactions.
|
||||||
|
|
@ -1745,7 +1745,7 @@ CODE
|
||||||
# @name select_interacting
|
# @name select_interacting
|
||||||
# @brief Selects shapes or regions of self which touch or overlap shapes from the other region
|
# @brief Selects shapes or regions of self which touch or overlap shapes from the other region
|
||||||
# @synopsis layer.select_interacting(other)
|
# @synopsis layer.select_interacting(other)
|
||||||
# @synopsis layer.select_interacting(other, count)
|
# @synopsis layer.select_interacting(other, min_count)
|
||||||
# @synopsis layer.select_interacting(other, min_count, max_count)
|
# @synopsis layer.select_interacting(other, min_count, max_count)
|
||||||
# @synopsis layer.select_interacting(other, min_count .. max_count)
|
# @synopsis layer.select_interacting(other, min_count .. max_count)
|
||||||
# This method selects all shapes or regions from self which touch or overlap shapes from the other
|
# This method selects all shapes or regions from self which touch or overlap shapes from the other
|
||||||
|
|
@ -1758,7 +1758,7 @@ CODE
|
||||||
# with respect to other edges or polygons. Texts can be selected with respect to
|
# with respect to other edges or polygons. Texts can be selected with respect to
|
||||||
# polygons. Polygons can be selected with respect to edges, texts and other polygons.
|
# polygons. Polygons can be selected with respect to edges, texts and other polygons.
|
||||||
#
|
#
|
||||||
# If a single count is given, shapes from self are selected only if they do interact with the given
|
# If a single count is given, shapes from self are selected only if they do interact at least with the given
|
||||||
# number of (different) shapes from the other layer. If a min and max count is given, shapes from
|
# number of (different) shapes from the other layer. If a min and max count is given, shapes from
|
||||||
# self are selected only if they interact with min_count or more, but a maximum of max_count different shapes
|
# self are selected only if they interact with min_count or more, but a maximum of max_count different shapes
|
||||||
# from the other layer. Two polygons overlapping or touching at two locations are counted as single interactions.
|
# from the other layer. Two polygons overlapping or touching at two locations are counted as single interactions.
|
||||||
|
|
@ -1767,7 +1767,7 @@ CODE
|
||||||
# @name select_not_interacting
|
# @name select_not_interacting
|
||||||
# @brief Selects shapes or regions of self which do not touch or overlap shapes from the other region
|
# @brief Selects shapes or regions of self which do not touch or overlap shapes from the other region
|
||||||
# @synopsis layer.select_not_interacting(other)
|
# @synopsis layer.select_not_interacting(other)
|
||||||
# @synopsis layer.select_not_interacting(other, count)
|
# @synopsis layer.select_not_interacting(other, min_count)
|
||||||
# @synopsis layer.select_not_interacting(other, min_count, max_count)
|
# @synopsis layer.select_not_interacting(other, min_count, max_count)
|
||||||
# @synopsis layer.select_not_interacting(other, min_count .. max_count)
|
# @synopsis layer.select_not_interacting(other, min_count .. max_count)
|
||||||
# This method selects all shapes or regions from self which do not touch or overlap shapes from the other
|
# This method selects all shapes or regions from self which do not touch or overlap shapes from the other
|
||||||
|
|
@ -1780,7 +1780,7 @@ CODE
|
||||||
# with respect to other edges or polygons. Texts can be selected with respect to
|
# with respect to other edges or polygons. Texts can be selected with respect to
|
||||||
# polygons. Polygons can be selected with respect to edges, texts and other polygons.
|
# polygons. Polygons can be selected with respect to edges, texts and other polygons.
|
||||||
#
|
#
|
||||||
# If a single count is given, shapes from self are selected only if they do not interact with the given
|
# If a single count is given, shapes from self are selected only if they interact with less than the given
|
||||||
# number of (different) shapes from the other layer. If a min and max count is given, shapes from
|
# number of (different) shapes from the other layer. If a min and max count is given, shapes from
|
||||||
# self are selected only if they interact with less than min_count or more than max_count different shapes
|
# self are selected only if they interact with less than min_count or more than max_count different shapes
|
||||||
# from the other layer. Two polygons overlapping or touching at two locations are counted as single interactions.
|
# from the other layer. Two polygons overlapping or touching at two locations are counted as single interactions.
|
||||||
|
|
@ -3301,16 +3301,20 @@ CODE
|
||||||
elsif args.size == 1
|
elsif args.size == 1
|
||||||
a = args[0]
|
a = args[0]
|
||||||
if a.is_a?(Range)
|
if a.is_a?(Range)
|
||||||
if a.min.to_i <= 0
|
if a.begin && a.begin.to_i <= 0
|
||||||
raise("#{f}: min_count argument must be a positive, non-zero number")
|
raise("#{f}: lower bound of range must be a positive, non-zero number")
|
||||||
|
end
|
||||||
|
if a.end
|
||||||
|
return [(a.begin || 1).to_i, a.end.to_i]
|
||||||
|
else
|
||||||
|
return [(a.begin || 1).to_i]
|
||||||
end
|
end
|
||||||
return [a.min.to_i, a.max.to_i]
|
|
||||||
elsif !a.is_a?(1.class)
|
elsif !a.is_a?(1.class)
|
||||||
raise("#{f}: count argument must be an integer number")
|
raise("#{f}: count argument must be an integer number")
|
||||||
elsif a <= 0
|
elsif a <= 0
|
||||||
raise("#{f}: count argument must be a positive, non-zero number")
|
raise("#{f}: count argument must be a positive, non-zero number")
|
||||||
else
|
else
|
||||||
return [a, a]
|
return [a]
|
||||||
end
|
end
|
||||||
elsif args.size == 2
|
elsif args.size == 2
|
||||||
amin = args[0]
|
amin = args[0]
|
||||||
|
|
|
||||||
|
|
@ -512,6 +512,8 @@ class DBRegion_TestClass < TestBase
|
||||||
r1.insert(RBA::Box::new(50, 70, 150, 270))
|
r1.insert(RBA::Box::new(50, 70, 150, 270))
|
||||||
r1.insert(RBA::Box::new(100, 70, 250, 270))
|
r1.insert(RBA::Box::new(100, 70, 250, 270))
|
||||||
r2 = RBA::Region::new(RBA::Box::new(-10, -20, 100, 200))
|
r2 = RBA::Region::new(RBA::Box::new(-10, -20, 100, 200))
|
||||||
|
r3 = RBA::Region::new(RBA::Box::new(150, 270, 160, 280))
|
||||||
|
r3 += r2
|
||||||
|
|
||||||
assert_equal(r1.merged_semantics?, true)
|
assert_equal(r1.merged_semantics?, true)
|
||||||
r1.merged_semantics = false
|
r1.merged_semantics = false
|
||||||
|
|
@ -520,19 +522,81 @@ class DBRegion_TestClass < TestBase
|
||||||
assert_equal(r1.inside(r2).to_s, "(10,20;10,200;100,200;100,20)")
|
assert_equal(r1.inside(r2).to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
assert_equal(r1.not_inside(r2).to_s, "(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
assert_equal(r1.not_inside(r2).to_s, "(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
assert_equal(r1.interacting(r2).to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
assert_equal(r1.interacting(r2).to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
|
assert_equal(r1.interacting(r3, 1).to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
|
assert_equal(r1.interacting(r3, 2).to_s, "(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
|
assert_equal(r1.interacting(r3, 3).to_s, "")
|
||||||
|
assert_equal(r1.interacting(r3, 1, 1).to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.interacting(r3, 2, 2).to_s, "(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
assert_equal(r1.not_interacting(r2).to_s, "")
|
assert_equal(r1.not_interacting(r2).to_s, "")
|
||||||
|
assert_equal(r1.not_interacting(r3, 1).to_s, "")
|
||||||
|
assert_equal(r1.not_interacting(r3, 2).to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.not_interacting(r3, 3).to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
|
assert_equal(r1.not_interacting(r3, 1, 1).to_s, "(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
|
assert_equal(r1.not_interacting(r3, 2, 2).to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
assert_equal(r1.overlapping(r2).to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70)")
|
assert_equal(r1.overlapping(r2).to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70)")
|
||||||
assert_equal(r1.not_overlapping(r2).to_s, "(100,70;100,270;250,270;250,70)")
|
assert_equal(r1.not_overlapping(r2).to_s, "(100,70;100,270;250,270;250,70)")
|
||||||
assert_equal(r1.outside(r2).to_s, "(100,70;100,270;250,270;250,70)")
|
assert_equal(r1.outside(r2).to_s, "(100,70;100,270;250,270;250,70)")
|
||||||
assert_equal(r1.not_outside(r2).to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70)")
|
assert_equal(r1.not_outside(r2).to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70)")
|
||||||
|
|
||||||
|
e2 = RBA::Edges::new(RBA::Edge::new(-10, -20, 100, 200))
|
||||||
|
e3 = RBA::Edges::new(RBA::Edge::new(150, 270, 160, 280))
|
||||||
|
e3 += e2
|
||||||
|
|
||||||
|
assert_equal(r1.interacting(e2).to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.interacting(e3, 1).to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.interacting(e3, 2).to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70)")
|
||||||
|
assert_equal(r1.interacting(e3, 3).to_s, "")
|
||||||
|
assert_equal(r1.interacting(e3, 1, 1).to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.interacting(e3, 2, 2).to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70)")
|
||||||
|
assert_equal(r1.not_interacting(e2).to_s, "")
|
||||||
|
assert_equal(r1.not_interacting(e3, 1).to_s, "")
|
||||||
|
assert_equal(r1.not_interacting(e3, 2).to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.not_interacting(e3, 3).to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.not_interacting(e3, 1, 1).to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70)")
|
||||||
|
assert_equal(r1.not_interacting(e3, 2, 2).to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
|
|
||||||
|
t2 = RBA::Texts::new(RBA::Text::new("a", RBA::Trans::new(50, 100)))
|
||||||
|
t3 = RBA::Texts::new(RBA::Text::new("b", RBA::Trans::new(150, 270)))
|
||||||
|
t3 += t2
|
||||||
|
|
||||||
|
assert_equal(r1.interacting(t2).to_s, "(50,70;50,270;150,270;150,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.interacting(t3, 1).to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.interacting(t3, 2).to_s, "(50,70;50,270;150,270;150,70)")
|
||||||
|
assert_equal(r1.interacting(t3, 3).to_s, "")
|
||||||
|
assert_equal(r1.interacting(t3, 1, 1).to_s, "(100,70;100,270;250,270;250,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.interacting(t3, 2, 2).to_s, "(50,70;50,270;150,270;150,70)")
|
||||||
|
assert_equal(r1.not_interacting(t2).to_s, "(100,70;100,270;250,270;250,70)")
|
||||||
|
assert_equal(r1.not_interacting(t3, 1).to_s, "")
|
||||||
|
assert_equal(r1.not_interacting(t3, 2).to_s, "(100,70;100,270;250,270;250,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.not_interacting(t3, 3).to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
assert_equal(r1.not_interacting(t3, 1, 1).to_s, "(50,70;50,270;150,270;150,70)")
|
||||||
|
assert_equal(r1.not_interacting(t3, 2, 2).to_s, "(100,70;100,270;250,270;250,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
|
||||||
rr = r1.dup
|
rr = r1.dup
|
||||||
rr.select_interacting(r2)
|
rr.select_interacting(r2)
|
||||||
assert_equal(rr.to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
assert_equal(rr.to_s, "(10,20;10,200;100,200;100,20);(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
|
rr = r1.dup
|
||||||
|
rr.select_interacting(r3, 2, 2)
|
||||||
|
assert_equal(rr.to_s, "(50,70;50,270;150,270;150,70);(100,70;100,270;250,270;250,70)")
|
||||||
|
rr = r1.dup
|
||||||
|
rr.select_interacting(e3, 2, 2)
|
||||||
|
assert_equal(rr.to_s, "(100,70;100,270;250,270;250,70);(50,70;50,270;150,270;150,70)")
|
||||||
|
rr = r1.dup
|
||||||
|
rr.select_interacting(t3, 2, 2)
|
||||||
|
assert_equal(rr.to_s, "(50,70;50,270;150,270;150,70)")
|
||||||
|
|
||||||
rr = r1.dup
|
rr = r1.dup
|
||||||
rr.select_not_interacting(r2)
|
rr.select_not_interacting(r2)
|
||||||
assert_equal(rr.to_s, "")
|
assert_equal(rr.to_s, "")
|
||||||
|
rr = r1.dup
|
||||||
|
rr.select_not_interacting(r3, 2, 2)
|
||||||
|
assert_equal(rr.to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
|
rr = r1.dup
|
||||||
|
rr.select_not_interacting(e3, 2, 2)
|
||||||
|
assert_equal(rr.to_s, "(10,20;10,200;100,200;100,20)")
|
||||||
|
rr = r1.dup
|
||||||
|
rr.select_not_interacting(t3, 2, 2)
|
||||||
|
assert_equal(rr.to_s, "(100,70;100,270;250,270;250,70);(10,20;10,200;100,200;100,20)")
|
||||||
|
|
||||||
rr = r1.dup
|
rr = r1.dup
|
||||||
rr.select_overlapping(r2)
|
rr.select_overlapping(r2)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue