Fixed #69 (DRC: 'inside' does not merge shapes of second input)

This commit is contained in:
Matthias Koefferlein 2018-01-30 00:40:17 +01:00
parent ccb76a9f09
commit 23c2ae7306
3 changed files with 105 additions and 3 deletions

View File

@ -255,6 +255,7 @@ public:
*
* If this flag is set, the interaction will include "touching" interactions in mode 0, i.e.
* touching shapes will be counted as interacting.
* In the other modes, this flag should be true (the default).
*/
void set_include_touching (bool f)
{
@ -299,7 +300,7 @@ public:
virtual int edge (bool north, bool enter, property_type p);
virtual int compare_ns () const;
virtual bool is_reset () const { return m_inside.empty (); }
virtual bool prefer_touch () const { return m_mode == 0 && m_include_touching; }
virtual bool prefer_touch () const { return m_include_touching; }
private:
int m_mode;

View File

@ -1273,7 +1273,7 @@ public:
*/
Region selected_inside (const Region &other) const
{
return selected_interacting_generic (other, -1, false, false);
return selected_interacting_generic (other, -1, true, false);
}
/**
@ -1285,7 +1285,7 @@ public:
*/
Region selected_not_inside (const Region &other) const
{
return selected_interacting_generic (other, -1, false, true);
return selected_interacting_generic (other, -1, true, true);
}
/**

View File

@ -748,6 +748,107 @@ TEST(18b)
}
}
TEST(18c)
{
// GitHub issue #69
db::Region r;
r.insert (db::Box (db::Point (-120, 0), db::Point (-100, 20)));
r.insert (db::Box (db::Point (-20, 0), db::Point (0, 20)));
r.insert (db::Box (db::Point (0, 0), db::Point (20, 20)));
r.insert (db::Box (db::Point (100, 0), db::Point (120, 20)));
db::Region rr;
rr.insert (db::Box (db::Point (-100, -10), db::Point (0, 30)));
rr.insert (db::Box (db::Point (0, -10), db::Point (100, 30)));
EXPECT_EQ (r.selected_outside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_inside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_not_inside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_interacting (rr).to_string (), "");
r.clear ();
r.insert (db::Box (db::Point (-120, 0), db::Point (-100, 20)));
r.insert (db::Box (db::Point (-20, 0), db::Point (20, 20)));
r.insert (db::Box (db::Point (100, 0), db::Point (120, 20)));
rr.clear ();
rr.insert (db::Box (db::Point (-100, -10), db::Point (0, 30)));
rr.insert (db::Box (db::Point (0, -10), db::Point (100, 30)));
EXPECT_EQ (r.selected_outside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_inside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_not_inside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_interacting (rr).to_string (), "");
r.clear ();
r.insert (db::Box (db::Point (-120, 0), db::Point (-100, 20)));
r.insert (db::Box (db::Point (-20, 0), db::Point (20, 20)));
r.insert (db::Box (db::Point (100, 0), db::Point (120, 20)));
rr.clear ();
rr.insert (db::Box (db::Point (-100, -10), db::Point (100, 30)));
EXPECT_EQ (r.selected_outside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_inside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_not_inside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_interacting (rr).to_string (), "");
r.clear ();
r.insert (db::Box (db::Point (-120, 0), db::Point (-100, 20)));
r.insert (db::Box (db::Point (-20, 0), db::Point (20, 20)));
r.insert (db::Box (db::Point (100, 0), db::Point (120, 20)));
rr.clear ();
rr.insert (db::Box (db::Point (-100, -10), db::Point (0, 30)));
rr.insert (db::Box (db::Point (1, -10), db::Point (100, 30)));
EXPECT_EQ (r.selected_outside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_inside (rr).to_string (), "");
EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)");
EXPECT_EQ (r.selected_not_inside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)");
EXPECT_EQ (r.selected_not_interacting (rr).to_string (), "");
r.clear ();
r.insert (db::Box (db::Point (-100, 0), db::Point (-80, 20)));
r.insert (db::Box (db::Point (-20, 0), db::Point (0, 20)));
r.insert (db::Box (db::Point (0, 0), db::Point (20, 20)));
r.insert (db::Box (db::Point (80, 0), db::Point (100, 20)));
rr.clear ();
rr.insert (db::Box (db::Point (-100, -10), db::Point (0, 30)));
rr.insert (db::Box (db::Point (0, -10), db::Point (100, 30)));
EXPECT_EQ (r.selected_outside (rr).to_string (), "");
EXPECT_EQ (r.selected_inside (rr).to_string (), "(-100,0;-100,20;-80,20;-80,0);(-20,0;-20,20;20,20;20,0);(80,0;80,20;100,20;100,0)");
EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-100,0;-100,20;-80,20;-80,0);(-20,0;-20,20;20,20;20,0);(80,0;80,20;100,20;100,0)");
EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-100,0;-100,20;-80,20;-80,0);(-20,0;-20,20;20,20;20,0);(80,0;80,20;100,20;100,0)");
EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-100,0;-100,20;-80,20;-80,0);(-20,0;-20,20;20,20;20,0);(80,0;80,20;100,20;100,0)");
EXPECT_EQ (r.selected_not_inside (rr).to_string (), "");
EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "");
EXPECT_EQ (r.selected_not_interacting (rr).to_string (), "");
}
TEST(19)
{
db::Region r1;