Refinement of solution for DRC hull generator, still not perfect.

This commit is contained in:
Matthias Koefferlein 2024-03-30 22:34:26 +01:00
parent 03d77bbff6
commit eb1ac4903e
3 changed files with 25 additions and 13 deletions

View File

@ -435,17 +435,18 @@ static void create_edge_segment (std::vector<db::Point> &points, db::metrics_typ
void void
DRCHullProcessor::process (const db::Polygon &poly, std::vector<db::Polygon> &result) const DRCHullProcessor::process (const db::Polygon &poly, std::vector<db::Polygon> &result) const
{ {
result.push_back (db::Polygon ()); db::EdgeProcessor ep;
std::vector<db::Point> points;
for (unsigned int i = 0; i < poly.holes () + 1; ++i) { for (unsigned int i = 0; i < poly.holes () + 1; ++i) {
points.clear ();
auto c = poly.contour (i); auto c = poly.contour (i);
if (c.size () < 2) { if (c.size () < 2) {
continue; continue;
} }
std::vector<db::Point> points;
for (auto p = c.begin (); p != c.end (); ++p) { for (auto p = c.begin (); p != c.end (); ++p) {
auto pp = p; auto pp = p;
@ -458,13 +459,24 @@ DRCHullProcessor::process (const db::Polygon &poly, std::vector<db::Polygon> &re
} }
if (i == 0) { for (auto p = points.begin (); p != points.end (); ++p) {
result.back ().assign_hull (points.begin (), points.end ());
} else { auto pp = p;
result.back ().insert_hole (points.begin (), points.end ()); ++pp;
if (pp == points.end ()) {
pp = points.begin ();
}
ep.insert (db::Edge (*p, *pp));
} }
} }
db::SimpleMerge op;
db::PolygonContainer psink (result);
db::PolygonGenerator pg (psink, false);
ep.process (pg, op);
} }
} }

View File

@ -552,11 +552,11 @@ PolygonService::do_finish_edit ()
} }
db::Polygon db::Polygon
PolygonService::get_polygon (bool all_points) const PolygonService::get_polygon (bool editing) const
{ {
db::Polygon poly; db::Polygon poly;
if (m_points.size () + (m_closure_set ? 1 : 0) < (all_points ? 3 : 4)) { if (! editing && m_points.size () + (m_closure_set ? 1 : 0) < 4) {
throw tl::Exception (tl::to_string (tr ("A polygon must have at least 3 points"))); throw tl::Exception (tl::to_string (tr ("A polygon must have at least 3 points")));
} }
@ -567,16 +567,16 @@ PolygonService::get_polygon (bool all_points) const
for (std::vector<db::DPoint>::const_iterator p = m_points.begin (); p + 1 != m_points.end (); ++p) { for (std::vector<db::DPoint>::const_iterator p = m_points.begin (); p + 1 != m_points.end (); ++p) {
points_dbu.push_back (trans () * *p); points_dbu.push_back (trans () * *p);
} }
if (all_points) { if (editing) {
points_dbu.push_back (trans () * m_points.back ()); points_dbu.push_back (trans () * m_points.back ());
} }
if (m_closure_set) { if (m_closure_set) {
points_dbu.push_back (trans () * m_closure); points_dbu.push_back (trans () * m_closure);
} }
poly.assign_hull (points_dbu.begin (), points_dbu.end (), true, true /*remove reflected*/); poly.assign_hull (points_dbu.begin (), points_dbu.end (), !editing /*compress*/, !editing /*remove reflected*/);
if (poly.hull ().size () < 3) { if (! editing && poly.hull ().size () < 3) {
throw tl::Exception (tl::to_string (tr ("A polygon must have at least 3 effective points"))); throw tl::Exception (tl::to_string (tr ("A polygon must have at least 3 effective points")));
} }

View File

@ -121,7 +121,7 @@ private:
db::DPoint m_last; db::DPoint m_last;
void update_marker (); void update_marker ();
db::Polygon get_polygon (bool all_points) const; db::Polygon get_polygon (bool editing) const;
void add_closure (); void add_closure ();
void set_last_point (const db::DPoint &p); void set_last_point (const db::DPoint &p);
}; };