New DRC features:

* inside, not_inside, outside, not_outside (edge/edge, edge/polygon)
* related select_*
* split_inside, split_outside (edge/edge, edge/polygon)
* andnot (edge/edge, edge/polygon)
* inside_outside_part (edge/polygon)
This commit is contained in:
Matthias Koefferlein 2022-08-31 23:38:23 +02:00
parent 81b605c197
commit c720e2d3eb
4 changed files with 119 additions and 27 deletions

View File

@ -2858,29 +2858,6 @@ CODE
CODE
end
%w(split_inside split_outside).each do |f|
eval <<"CODE"
def #{f}(other, *args)
@engine._context("#{f}") do
check_is_layer(other)
requires_edges_or_region
if self.data.is_a?(RBA::Edges)
other.requires_edges_or_region
elsif self.data.is_a?(RBA::Region)
other.requires_region
end
res = @engine._tcmd_a2(self.data, 0, self.data.class, self.data.class, :#{f}, other.data, *minmax_count(*args))
[ DRCLayer::new(@engine, res[0]), DRCLayer::new(@engine, res[1]) ]
end
end
CODE
end
%w(overlapping not_overlapping covering not_covering).each do |f|
eval <<"CODE"
@ -2971,15 +2948,19 @@ CODE
%w(split_inside split_outside).each do |f|
eval <<"CODE"
def #{f}(other)
def #{f}(other, *args)
@engine._context("#{f}") do
check_is_layer(other)
requires_region
other.requires_region
requires_edges_or_region
if self.data.is_a?(RBA::Edges)
other.requires_edges_or_region
elsif self.data.is_a?(RBA::Region)
other.requires_region
end
res = @engine._tcmd_a2(self.data, 0, self.data.class, self.data.class, :#{f}, other.data)
res = @engine._tcmd_a2(self.data, 0, self.data.class, self.data.class, :#{f}, other.data, *minmax_count(*args))
[ DRCLayer::new(@engine, res[0]), DRCLayer::new(@engine, res[1]) ]
end

View File

@ -169,6 +169,22 @@ def run_testsuite(dm, ic, tiled = false, hier = false)
p.output(lb, dm + 10)
m.output(lb, dm + 11)
b.edges.inside(c).output(lb, dm + 20)
b.edges.not_inside(c).output(lb, dm + 21)
b.edges.inside(empty).output(lb, dm + 22)
b.edges.not_inside(empty).output(lb, dm + 23)
(p, m) = b.edges.split_inside(c)
p.output(lb, dm + 30)
m.output(lb, dm + 31)
b.edges.inside(c.edges).output(lb, dm + 40)
b.edges.not_inside(c.edges).output(lb, dm + 41)
b.edges.inside(empty.edges).output(lb, dm + 42)
b.edges.not_inside(empty.edges).output(lb, dm + 43)
(p, m) = b.edges.split_inside(c.edges)
p.output(lb, dm + 50)
m.output(lb, dm + 51)
b.covering(c).output(lb, dm + 100)
b.not_covering(c).output(lb, dm + 101)
b.covering(empty).output(lb, dm + 102)
@ -185,6 +201,22 @@ def run_testsuite(dm, ic, tiled = false, hier = false)
p.output(lb + 1, dm + 10)
m.output(lb + 1, dm + 11)
b.edges.outside(c).output(lb + 1, dm + 20)
b.edges.not_outside(c).output(lb + 1, dm + 21)
b.edges.outside(empty).output(lb + 1, dm + 22)
b.edges.not_outside(empty).output(lb + 1, dm + 23)
(p, m) = b.edges.split_outside(c)
p.output(lb + 1, dm + 30)
m.output(lb + 1, dm + 31)
b.edges.outside(c.edges).output(lb + 1, dm + 40)
b.edges.not_outside(c.edges).output(lb + 1, dm + 41)
b.edges.outside(empty.edges).output(lb + 1, dm + 42)
b.edges.not_outside(empty.edges).output(lb + 1, dm + 43)
(p, m) = b.edges.split_outside(c.edges)
p.output(lb + 1, dm + 50)
m.output(lb + 1, dm + 51)
b.overlapping(c).output(lb + 2, dm)
b.not_overlapping(c).output(lb + 2, dm + 1)
b.overlapping(empty).output(lb + 2, dm + 2)
@ -201,6 +233,22 @@ def run_testsuite(dm, ic, tiled = false, hier = false)
p.output(lb + 3, dm + 10)
m.output(lb + 3, dm + 11)
b.edges.interacting(c).output(lb + 3, dm + 20)
b.edges.not_interacting(c).output(lb + 3, dm + 21)
b.edges.interacting(empty).output(lb + 3, dm + 22)
b.edges.not_interacting(empty).output(lb + 3, dm + 23)
(p, m) = b.edges.split_interacting(c)
p.output(lb + 3, dm + 30)
m.output(lb + 3, dm + 31)
b.edges.interacting(c.edges).output(lb + 3, dm + 40)
b.edges.not_interacting(c.edges).output(lb + 3, dm + 41)
b.edges.interacting(empty.edges).output(lb + 3, dm + 42)
b.edges.not_interacting(empty.edges).output(lb + 3, dm + 43)
(p, m) = b.edges.split_interacting(c.edges)
p.output(lb + 3, dm + 50)
m.output(lb + 3, dm + 51)
bdup = b.dup
bdup.select_inside(c)
bdup.xor(b.inside(c)).output(lb + 4, dm)
@ -213,6 +261,31 @@ def run_testsuite(dm, ic, tiled = false, hier = false)
bdup = b.dup
bdup.select_not_inside(empty)
bdup.output(lb + 4, dm + 3)
bdup = b.dup.edges
bdup.select_inside(c)
bdup.xor(b.edges.inside(c)).output(lb + 4, dm + 10)
bdup = b.dup.edges
bdup.select_not_inside(c)
bdup.output(lb + 4, dm + 11)
bdup = b.dup.edges
bdup.select_inside(empty)
bdup.output(lb + 4, dm + 12)
bdup = b.dup.edges
bdup.select_not_inside(empty)
bdup.output(lb + 4, dm + 13)
bdup = b.dup.edges
bdup.select_inside(c.edges)
bdup.xor(b.edges.inside(c.edges)).output(lb + 4, dm + 20)
bdup = b.dup.edges
bdup.select_not_inside(c.edges)
bdup.output(lb + 4, dm + 21)
bdup = b.dup.edges
bdup.select_inside(empty)
bdup.output(lb + 4, dm + 22)
bdup = b.dup.edges
bdup.select_not_inside(empty)
bdup.output(lb + 4, dm + 23)
bdup = b.dup
bdup.select_outside(c)
bdup.xor(b.outside(c)).output(lb + 5, dm)
@ -225,6 +298,31 @@ def run_testsuite(dm, ic, tiled = false, hier = false)
bdup = b.dup
bdup.select_not_outside(empty)
bdup.output(lb + 5, dm + 3)
bdup = b.dup.edges
bdup.select_outside(c)
bdup.xor(b.edges.outside(c)).output(lb + 5, dm + 10)
bdup = b.dup.edges
bdup.select_not_outside(c)
bdup.output(lb + 5, dm + 11)
bdup = b.dup.edges
bdup.select_outside(empty)
bdup.output(lb + 5, dm + 12)
bdup = b.dup.edges
bdup.select_not_outside(empty)
bdup.output(lb + 5, dm + 13)
bdup = b.dup.edges
bdup.select_outside(c.edges)
bdup.xor(b.edges.outside(c.edges)).output(lb + 5, dm + 20)
bdup = b.dup.edges
bdup.select_not_outside(c.edges)
bdup.output(lb + 5, dm + 21)
bdup = b.dup.edges
bdup.select_outside(empty)
bdup.output(lb + 5, dm + 22)
bdup = b.dup.edges
bdup.select_not_outside(empty)
bdup.output(lb + 5, dm + 23)
bdup = b.dup
bdup.select_overlapping(c)
bdup.xor(b.overlapping(c)).output(lb + 6, dm)
@ -237,6 +335,7 @@ def run_testsuite(dm, ic, tiled = false, hier = false)
bdup = b.dup
bdup.select_not_overlapping(empty)
bdup.output(lb + 6, dm + 3)
bdup = b.dup
bdup.select_interacting(c)
bdup.xor(b.interacting(c)).output(lb + 7, dm)
@ -249,8 +348,10 @@ def run_testsuite(dm, ic, tiled = false, hier = false)
bdup = b.dup
bdup.select_not_interacting(empty)
bdup.output(lb + 7, dm + 3)
b.inside(empty).output(lb + 8, dm)
b.not_inside(empty).output(lb + 8, dm + 1)
b.outside(empty).output(lb + 9, dm)
b.not_outside(empty).output(lb + 9, dm + 1)
@ -641,6 +742,16 @@ def run_testsuite(dm, ic, tiled = false, hier = false)
p.output(lb + 4, dm)
p = b.edges.intersections(c.edges)
p.output(lb + 5, dm)
(u, v) = c.edges.andnot(b.edges)
u.output(lb + 6, dm)
v.output(lb + 6, dm + 1)
p = b.edges.inside_part(c)
p.output(lb + 7, dm)
p = b.edges.outside_part(c)
p.output(lb + 7, dm + 1)
(u, v) = b.edges.inside_outside_part(c)
u.output(lb + 7, dm + 2)
v.output(lb + 7, dm + 3)
lb += 10 #450
message "--- texts and filters #{lb}"

Binary file not shown.

Binary file not shown.