Commit e2d4b16b authored by jean-pierre charras's avatar jean-pierre charras

Updated boost::polygon from http://svn.boost.org/svn/boost/trunk/boost/polygon...

Updated boost::polygon from http://svn.boost.org/svn/boost/trunk/boost/polygon (boost 1.44) Seems fix some issues.
parents 8d777fc6 75b5c247
...@@ -29,7 +29,7 @@ private: ...@@ -29,7 +29,7 @@ private:
public: public:
iterator_geometry_to_set() : rectangle_(), vertex_(), corner_(4), orient_(), is_hole_() {} iterator_geometry_to_set() : rectangle_(), vertex_(), corner_(4), orient_(), is_hole_() {}
iterator_geometry_to_set(const rectangle_type& rectangle, direction_1d dir, iterator_geometry_to_set(const rectangle_type& rectangle, direction_1d dir,
orientation_2d orient = HORIZONTAL, bool is_hole = false) : orientation_2d orient = HORIZONTAL, bool is_hole = false, bool = false, direction_1d = CLOCKWISE) :
rectangle_(), vertex_(), corner_(0), orient_(orient), is_hole_(is_hole) { rectangle_(), vertex_(), corner_(0), orient_(orient), is_hole_(is_hole) {
assign(rectangle_, rectangle); assign(rectangle_, rectangle);
if(dir == HIGH) corner_ = 4; if(dir == HIGH) corner_ = 4;
...@@ -93,7 +93,7 @@ private: ...@@ -93,7 +93,7 @@ private:
int polygon_index; int polygon_index;
public: public:
iterator_geometry_to_set() : vertex_(), itrb(), itre(), last_vertex_(), is_hole_(), multiplier_(), first_pt(), second_pt(), pts(), use_wrap(), orient_(), polygon_index(-1) {} iterator_geometry_to_set() : vertex_(), itrb(), itre(), last_vertex_(), is_hole_(), multiplier_(), first_pt(), second_pt(), pts(), use_wrap(), orient_(), polygon_index(-1) {}
iterator_geometry_to_set(const polygon_type& polygon, direction_1d dir, orientation_2d orient = HORIZONTAL, bool is_hole = false) : iterator_geometry_to_set(const polygon_type& polygon, direction_1d dir, orientation_2d orient = HORIZONTAL, bool is_hole = false, bool winding_override = false, direction_1d w = CLOCKWISE) :
vertex_(), itrb(), itre(), last_vertex_(), vertex_(), itrb(), itre(), last_vertex_(),
is_hole_(is_hole), multiplier_(), first_pt(), second_pt(), pts(), use_wrap(), is_hole_(is_hole), multiplier_(), first_pt(), second_pt(), pts(), use_wrap(),
orient_(orient), polygon_index(0) { orient_(orient), polygon_index(0) {
...@@ -103,7 +103,9 @@ public: ...@@ -103,7 +103,9 @@ public:
if(itrb == itre || dir == HIGH || size(polygon) < 4) { if(itrb == itre || dir == HIGH || size(polygon) < 4) {
polygon_index = -1; polygon_index = -1;
} else { } else {
direction_1d wdir = winding(polygon); direction_1d wdir = w;
if(!winding_override)
wdir = winding(polygon);
multiplier_ = wdir == LOW ? -1 : 1; multiplier_ = wdir == LOW ? -1 : 1;
if(is_hole_) multiplier_ *= -1; if(is_hole_) multiplier_ *= -1;
first_pt = pts[0] = *itrb; first_pt = pts[0] = *itrb;
...@@ -182,9 +184,7 @@ public: ...@@ -182,9 +184,7 @@ public:
vertex_.second.first =pts[1].get(orient_); vertex_.second.first =pts[1].get(orient_);
if(pts[1] == pts[2]) { if(pts[1] == pts[2]) {
vertex_.second.second = 0; vertex_.second.second = 0;
return; } else if(pts[0].get(HORIZONTAL) != pts[1].get(HORIZONTAL)) {
}
if(pts[0].get(HORIZONTAL) != pts[1].get(HORIZONTAL)) {
vertex_.second.second = -1; vertex_.second.second = -1;
} else if(pts[0].get(VERTICAL) != pts[1].get(VERTICAL)) { } else if(pts[0].get(VERTICAL) != pts[1].get(VERTICAL)) {
vertex_.second.second = 1; vertex_.second.second = 1;
...@@ -214,7 +214,7 @@ private: ...@@ -214,7 +214,7 @@ private:
public: public:
iterator_geometry_to_set() : itrb(), itre(), itrhib(), itrhie(), itrhb(), itrhe(), orient_(), is_hole_(), started_holes() {} iterator_geometry_to_set() : itrb(), itre(), itrhib(), itrhie(), itrhb(), itrhe(), orient_(), is_hole_(), started_holes() {}
iterator_geometry_to_set(const polygon_with_holes_type& polygon, direction_1d dir, iterator_geometry_to_set(const polygon_with_holes_type& polygon, direction_1d dir,
orientation_2d orient = HORIZONTAL, bool is_hole = false) : orientation_2d orient = HORIZONTAL, bool is_hole = false, bool = false, direction_1d = CLOCKWISE) :
itrb(), itre(), itrhib(), itrhie(), itrhb(), itrhe(), orient_(orient), is_hole_(is_hole), started_holes() { itrb(), itre(), itrhib(), itrhie(), itrhb(), itrhe(), orient_(orient), is_hole_(is_hole), started_holes() {
itre = iterator_geometry_to_set<polygon_90_concept, polygon_with_holes_type>(polygon, HIGH, orient, is_hole_); itre = iterator_geometry_to_set<polygon_90_concept, polygon_with_holes_type>(polygon, HIGH, orient, is_hole_);
itrhe = end_holes(polygon); itrhe = end_holes(polygon);
......
...@@ -251,12 +251,14 @@ namespace boost { namespace polygon{ ...@@ -251,12 +251,14 @@ namespace boost { namespace polygon{
return; return;
} }
Unit firstY = (*iter).y(); Unit firstY = (*iter).y();
Unit firstX = (*iter).x();
++iter; ++iter;
if(iter == tailp_->points.end()) { if(iter == tailp_->points.end()) {
tailp_->points.push_front(point); tailp_->points.push_front(point);
return; return;
} }
if(iter->y() == point.y() && firstY == point.y()) { if((iter->y() == point.y() && firstY == point.y()) ||
(iter->x() == point.x() && firstX == point.x())){
--iter; --iter;
*iter = point; *iter = point;
} else { } else {
...@@ -274,12 +276,14 @@ namespace boost { namespace polygon{ ...@@ -274,12 +276,14 @@ namespace boost { namespace polygon{
return; return;
} }
Unit firstY = (*iter).y(); Unit firstY = (*iter).y();
Unit firstX = (*iter).x();
++iter; ++iter;
if(iter == tailp_->points.rend()) { if(iter == tailp_->points.rend()) {
tailp_->points.push_back(point); tailp_->points.push_back(point);
return; return;
} }
if(iter->y() == point.y() && firstY == point.y()) { if((iter->y() == point.y() && firstY == point.y()) ||
(iter->x() == point.x() && firstX == point.x())){
--iter; --iter;
*iter = point; *iter = point;
} else { } else {
...@@ -474,7 +478,7 @@ namespace boost { namespace polygon{ ...@@ -474,7 +478,7 @@ namespace boost { namespace polygon{
ct counts[4]; ct counts[4];
}; };
typedef Vertex45CountT<int> Vertex45Count; typedef Vertex45CountT<signed char> Vertex45Count;
// inline std::ostream& operator<< (std::ostream& o, const Vertex45Count& c) { // inline std::ostream& operator<< (std::ostream& o, const Vertex45Count& c) {
// o << c[0] << ", " << c[1] << ", "; // o << c[0] << ", " << c[1] << ", ";
...@@ -492,7 +496,8 @@ namespace boost { namespace polygon{ ...@@ -492,7 +496,8 @@ namespace boost { namespace polygon{
inline Vertex45CompactT(const Point& point, int riseIn, int countIn) : pt(point), count() { inline Vertex45CompactT(const Point& point, int riseIn, int countIn) : pt(point), count() {
count[riseIn+1] = countIn; count[riseIn+1] = countIn;
} }
inline Vertex45CompactT(const Vertex45T& vertex) : pt(vertex.pt), count() { template <typename ct2>
inline Vertex45CompactT(const typename boolean_op_45<Unit>::template Vertex45T<ct2>& vertex) : pt(vertex.pt), count() {
count[vertex.rise+1] = vertex.count; count[vertex.rise+1] = vertex.count;
} }
inline Vertex45CompactT(const Vertex45CompactT& vertex) : pt(vertex.pt), count(vertex.count) {} inline Vertex45CompactT(const Vertex45CompactT& vertex) : pt(vertex.pt), count(vertex.count) {}
...@@ -2244,6 +2249,7 @@ namespace boost { namespace polygon{ ...@@ -2244,6 +2249,7 @@ namespace boost { namespace polygon{
struct geometry_concept<PolyLine45PolygonData<T> > { typedef polygon_45_with_holes_concept type; }; struct geometry_concept<PolyLine45PolygonData<T> > { typedef polygon_45_with_holes_concept type; };
template <typename T> template <typename T>
struct geometry_concept<PolyLine45HoleData<T> > { typedef polygon_45_concept type; }; struct geometry_concept<PolyLine45HoleData<T> > { typedef polygon_45_concept type; };
} }
} }
#endif #endif
...@@ -124,13 +124,13 @@ namespace boost { namespace polygon{ ...@@ -124,13 +124,13 @@ namespace boost { namespace polygon{
}; };
template <typename ltype, typename rtype, int op_type> template <typename ltype, typename rtype, int op_type>
typename polygon_45_set_view<ltype, rtype, op_type>::iterator_type typename polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::iterator_type
polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >:: polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::
begin(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) { begin(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) {
return polygon_45_set.begin(); return polygon_45_set.begin();
} }
template <typename ltype, typename rtype, int op_type> template <typename ltype, typename rtype, int op_type>
typename polygon_45_set_view<ltype, rtype, op_type>::iterator_type typename polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::iterator_type
polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >:: polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::
end(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) { end(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) {
return polygon_45_set.end(); return polygon_45_set.end();
......
...@@ -140,13 +140,13 @@ namespace boost { namespace polygon{ ...@@ -140,13 +140,13 @@ namespace boost { namespace polygon{
}; };
template <typename ltype, typename rtype, typename op_type> template <typename ltype, typename rtype, typename op_type>
typename polygon_90_set_view<ltype, rtype, op_type>::iterator_type typename polygon_90_set_traits<polygon_90_set_view<ltype, rtype, op_type> >::iterator_type
polygon_90_set_traits<polygon_90_set_view<ltype, rtype, op_type> >:: polygon_90_set_traits<polygon_90_set_view<ltype, rtype, op_type> >::
begin(const polygon_90_set_view<ltype, rtype, op_type>& polygon_set) { begin(const polygon_90_set_view<ltype, rtype, op_type>& polygon_set) {
return polygon_set.begin(); return polygon_set.begin();
} }
template <typename ltype, typename rtype, typename op_type> template <typename ltype, typename rtype, typename op_type>
typename polygon_90_set_view<ltype, rtype, op_type>::iterator_type typename polygon_90_set_traits<polygon_90_set_view<ltype, rtype, op_type> >::iterator_type
polygon_90_set_traits<polygon_90_set_view<ltype, rtype, op_type> >:: polygon_90_set_traits<polygon_90_set_view<ltype, rtype, op_type> >::
end(const polygon_90_set_view<ltype, rtype, op_type>& polygon_set) { end(const polygon_90_set_view<ltype, rtype, op_type>& polygon_set) {
return polygon_set.end(); return polygon_set.end();
......
...@@ -42,7 +42,7 @@ namespace boost { namespace polygon{ ...@@ -42,7 +42,7 @@ namespace boost { namespace polygon{
ivlIds_.second = that.ivlIds_.second; ivlIds_.second = that.ivlIds_.second;
incremented_ = that.incremented_; incremented_ = that.incremented_;
return *this; return *this;
}; }
inline bool operator==(const iterator& that) { return itr_ == that.itr_; } inline bool operator==(const iterator& that) { return itr_ == that.itr_; }
inline bool operator!=(const iterator& that) { return itr_ != that.itr_; } inline bool operator!=(const iterator& that) { return itr_ != that.itr_; }
inline iterator& operator++() { inline iterator& operator++() {
......
...@@ -1721,7 +1721,7 @@ namespace polygon_formation { ...@@ -1721,7 +1721,7 @@ namespace polygon_formation {
unsigned int get_polygons(output_container& container, iterator_type begin, iterator_type end, unsigned int get_polygons(output_container& container, iterator_type begin, iterator_type end,
orientation_2d orient, bool fracture_holes, concept_type ) { orientation_2d orient, bool fracture_holes, concept_type ) {
typedef typename output_container::value_type polygon_type; typedef typename output_container::value_type polygon_type;
typedef typename iterator_type::value_type::first_type coordinate_type; typedef typename std::iterator_traits<iterator_type>::value_type::first_type coordinate_type;
polygon_type poly; polygon_type poly;
unsigned int countPolygons = 0; unsigned int countPolygons = 0;
typedef typename geometry_concept<polygon_type>::type polygon_concept_type; typedef typename geometry_concept<polygon_type>::type polygon_concept_type;
......
...@@ -153,13 +153,13 @@ namespace boost { namespace polygon{ ...@@ -153,13 +153,13 @@ namespace boost { namespace polygon{
}; };
template <typename ltype, typename rtype, int op_type> template <typename ltype, typename rtype, int op_type>
typename polygon_set_view<ltype, rtype, op_type>::iterator_type typename polygon_set_traits<polygon_set_view<ltype, rtype, op_type> >::iterator_type
polygon_set_traits<polygon_set_view<ltype, rtype, op_type> >:: polygon_set_traits<polygon_set_view<ltype, rtype, op_type> >::
begin(const polygon_set_view<ltype, rtype, op_type>& polygon_set) { begin(const polygon_set_view<ltype, rtype, op_type>& polygon_set) {
return polygon_set.begin(); return polygon_set.begin();
} }
template <typename ltype, typename rtype, int op_type> template <typename ltype, typename rtype, int op_type>
typename polygon_set_view<ltype, rtype, op_type>::iterator_type typename polygon_set_traits<polygon_set_view<ltype, rtype, op_type> >::iterator_type
polygon_set_traits<polygon_set_view<ltype, rtype, op_type> >:: polygon_set_traits<polygon_set_view<ltype, rtype, op_type> >::
end(const polygon_set_view<ltype, rtype, op_type>& polygon_set) { end(const polygon_set_view<ltype, rtype, op_type>& polygon_set) {
return polygon_set.end(); return polygon_set.end();
......
...@@ -34,17 +34,29 @@ namespace boost { namespace polygon{ ...@@ -34,17 +34,29 @@ namespace boost { namespace polygon{
#endif #endif
{ (*this) = that; } { (*this) = that; }
template <typename other> template <typename other>
point_data(const other& that) : coords_() { (*this) = that; } point_data(const other& that)
#ifndef BOOST_POLYGON_MSVC
:coords_()
#endif
{ (*this) = that; }
inline point_data& operator=(const point_data& that) { inline point_data& operator=(const point_data& that) {
coords_[0] = that.coords_[0]; coords_[1] = that.coords_[1]; return *this; coords_[0] = that.coords_[0]; coords_[1] = that.coords_[1]; return *this;
} }
template<typename T1, typename T2> template<typename T1, typename T2>
inline point_data(const T1& x, const T2& y):coords_() { inline point_data(const T1& x, const T2& y)
#ifndef BOOST_POLYGON_MSVC
:coords_()
#endif
{
coords_[HORIZONTAL] = (coordinate_type)x; coords_[HORIZONTAL] = (coordinate_type)x;
coords_[VERTICAL] = (coordinate_type)y; coords_[VERTICAL] = (coordinate_type)y;
} }
template <typename T2> template <typename T2>
inline point_data(const point_data<T2>& rvalue):coords_() { inline point_data(const point_data<T2>& rvalue)
#ifndef BOOST_POLYGON_MSVC
:coords_()
#endif
{
coords_[HORIZONTAL] = (coordinate_type)(rvalue.x()); coords_[HORIZONTAL] = (coordinate_type)(rvalue.x());
coords_[VERTICAL] = (coordinate_type)(rvalue.y()); coords_[VERTICAL] = (coordinate_type)(rvalue.y());
} }
......
...@@ -62,7 +62,7 @@ public: ...@@ -62,7 +62,7 @@ public:
inline std::size_t size() const { return coords_.size(); } inline std::size_t size() const { return coords_.size(); }
private: public:
std::vector<point_data<coordinate_type> > coords_; std::vector<point_data<coordinate_type> > coords_;
}; };
......
...@@ -1541,11 +1541,11 @@ namespace boost { namespace polygon{ ...@@ -1541,11 +1541,11 @@ namespace boost { namespace polygon{
polygon_90_set_data<Unit> l90sd(VERTICAL), r90sd(VERTICAL), output(VERTICAL); polygon_90_set_data<Unit> l90sd(VERTICAL), r90sd(VERTICAL), output(VERTICAL);
for(typename value_type::const_iterator itr = data_.begin(); itr != data_.end(); ++itr) { for(typename value_type::const_iterator itr = data_.begin(); itr != data_.end(); ++itr) {
if((*itr).count[3] == 0) continue; //skip all non vertical edges if((*itr).count[3] == 0) continue; //skip all non vertical edges
l90sd.insert(std::make_pair((*itr).pt.x(), std::make_pair((*itr).pt.y(), (*itr).count[3])), false, VERTICAL); l90sd.insert(std::make_pair((*itr).pt.x(), std::make_pair<Unit, int>((*itr).pt.y(), (*itr).count[3])), false, VERTICAL);
} }
for(typename value_type::const_iterator itr = rvalue.data_.begin(); itr != rvalue.data_.end(); ++itr) { for(typename value_type::const_iterator itr = rvalue.data_.begin(); itr != rvalue.data_.end(); ++itr) {
if((*itr).count[3] == 0) continue; //skip all non vertical edges if((*itr).count[3] == 0) continue; //skip all non vertical edges
r90sd.insert(std::make_pair((*itr).pt.x(), std::make_pair((*itr).pt.y(), (*itr).count[3])), false, VERTICAL); r90sd.insert(std::make_pair((*itr).pt.x(), std::make_pair<Unit, int>((*itr).pt.y(), (*itr).count[3])), false, VERTICAL);
} }
l90sd.sort(); l90sd.sort();
r90sd.sort(); r90sd.sort();
...@@ -1673,7 +1673,7 @@ namespace boost { namespace polygon{ ...@@ -1673,7 +1673,7 @@ namespace boost { namespace polygon{
polygon_90_set_data<Unit> l90sd(VERTICAL); polygon_90_set_data<Unit> l90sd(VERTICAL);
for(typename value_type::const_iterator itr = data_.begin(); itr != data_.end(); ++itr) { for(typename value_type::const_iterator itr = data_.begin(); itr != data_.end(); ++itr) {
if((*itr).count[3] == 0) continue; //skip all non vertical edges if((*itr).count[3] == 0) continue; //skip all non vertical edges
l90sd.insert(std::make_pair((*itr).pt.x(), std::make_pair((*itr).pt.y(), (*itr).count[3])), false, VERTICAL); l90sd.insert(std::make_pair((*itr).pt.x(), std::make_pair<Unit, int>((*itr).pt.y(), (*itr).count[3])), false, VERTICAL);
} }
l90sd.sort(); l90sd.sort();
#ifdef BOOST_POLYGON_MSVC #ifdef BOOST_POLYGON_MSVC
......
...@@ -137,7 +137,7 @@ namespace boost { namespace polygon{ ...@@ -137,7 +137,7 @@ namespace boost { namespace polygon{
static inline bool clean(const polygon_45_set_data<T>& polygon_set) { polygon_set.clean(); return true; } static inline bool clean(const polygon_45_set_data<T>& polygon_set) { polygon_set.clean(); return true; }
static inline bool sorted(const polygon_45_set_data<T>& polygon_set) { int untested = 0;polygon_set.sort(); return true; } static inline bool sorted(const polygon_45_set_data<T>& polygon_set) { polygon_set.sort(); return true; }
}; };
} }
......
...@@ -96,10 +96,12 @@ public: ...@@ -96,10 +96,12 @@ public:
return holes_.size(); return holes_.size();
} }
private: public:
polygon_45_data<coordinate_type> self_; polygon_45_data<coordinate_type> self_;
std::list<hole_type> holes_; std::list<hole_type> holes_;
}; };
} }
} }
#endif #endif
......
...@@ -60,7 +60,7 @@ public: ...@@ -60,7 +60,7 @@ public:
inline std::size_t size() const { return coords_.size(); } inline std::size_t size() const { return coords_.size(); }
private: public:
std::vector<point_data<coordinate_type> > coords_; std::vector<point_data<coordinate_type> > coords_;
}; };
......
This diff is collapsed.
...@@ -121,7 +121,7 @@ namespace boost { namespace polygon{ ...@@ -121,7 +121,7 @@ namespace boost { namespace polygon{
static inline bool clean(const polygon_set_data<T>& polygon_set) { polygon_set.clean(); return true; } static inline bool clean(const polygon_set_data<T>& polygon_set) { polygon_set.clean(); return true; }
static inline bool sorted(const polygon_set_data<T>& polygon_set) { int untested = 0;polygon_set.sort(); return true; } static inline bool sorted(const polygon_set_data<T>& polygon_set) { polygon_set.sort(); return true; }
}; };
} }
......
...@@ -96,7 +96,7 @@ public: ...@@ -96,7 +96,7 @@ public:
return holes_.size(); return holes_.size();
} }
private: public:
polygon_data<coordinate_type> self_; polygon_data<coordinate_type> self_;
std::list<hole_type> holes_; std::list<hole_type> holes_;
}; };
......
...@@ -131,33 +131,10 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb ) ...@@ -131,33 +131,10 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
* so m_ZoneMinThickness is the min thickness of the filled zones areas * so m_ZoneMinThickness is the min thickness of the filled zones areas
* the main polygon is stored in polyset_zone_solid_areas * the main polygon is stored in polyset_zone_solid_areas
*/ */
#if 1
{
/* creates the main polygon (i.e. the filled area using only one outline)
* in GroupA in Bool_Engine to do a BOOL_CORRECTION operation
* to reserve a m_ZoneMinThickness/2 margin around the outlines
*/
Bool_Engine* booleng = new Bool_Engine();
ArmBoolEng( booleng, true );
CopyPolygonsFromFilledPolysListToBoolengine( booleng, GROUP_A );
booleng->SetCorrectionFactor( (double) -margin );
booleng->Do_Operation( BOOL_CORRECTION );
/* Now copy the new outline in m_FilledPolysList */
m_FilledPolysList.clear();
CopyPolygonsFromBoolengineToFilledPolysList( booleng );
delete booleng;
CopyPolygonsFromFilledPolysListTotKPolygonList( this, polyset_zone_solid_areas );
}
#else
/* currently does not work well.
* using kbool gives reliable results
* using boost::polygone gives erroneous results
*/
CopyPolygonsFromFilledPolysListTotKPolygonList( this, CopyPolygonsFromFilledPolysListTotKPolygonList( this,
polyset_zone_solid_areas ); polyset_zone_solid_areas );
polyset_zone_solid_areas -= margin; polyset_zone_solid_areas -= margin;
#endif
if( polyset_zone_solid_areas.size() == 0 ) if( polyset_zone_solid_areas.size() == 0 )
return; return;
...@@ -523,82 +500,6 @@ void AddUnconnectedThermalStubsToKPolygonList( std::vector<CPolyPt>& aCornerBuff ...@@ -523,82 +500,6 @@ void AddUnconnectedThermalStubsToKPolygonList( std::vector<CPolyPt>& aCornerBuff
} }
/** Function CopyPolygonsFromFilledPolysListToBoolengine
* Copy (Add) polygons found in m_FilledPolysList to kbool BoolEngine
* m_FilledPolysList may have more than one polygon
* @param aBoolengine = kbool engine
* @param aGroup = group in kbool engine (GROUP_A or GROUP_B only)
* @return the corner count
*/
int ZONE_CONTAINER::CopyPolygonsFromFilledPolysListToBoolengine(
Bool_Engine* aBoolengine, GroupType aGroup )
{
unsigned corners_count = m_FilledPolysList.size();
int count = 0;
unsigned ic = 0;
while( ic < corners_count )
{
if( aBoolengine->StartPolygonAdd( aGroup ) )
{
for( ; ic < corners_count; ic++ )
{
CPolyPt* corner = &m_FilledPolysList[ic];
aBoolengine->AddPoint( corner->x, corner->y );
count++;
if( corner->end_contour )
{
ic++;
break;
}
}
aBoolengine->EndPolygonAdd();
}
}
return count;
}
/** Function CopyPolygonsFromBoolengineToFilledPolysList
* Copy (Add) polygons created by kbool (after Do_Operation) to m_FilledPolysList
* @param aBoolengine = kbool engine
* @return the corner count
*/
int ZONE_CONTAINER::CopyPolygonsFromBoolengineToFilledPolysList(
Bool_Engine* aBoolengine )
{
int count = 0;
while( aBoolengine->StartPolygonGet() )
{
CPolyPt corner( 0, 0, false );
while( aBoolengine->PolygonHasMorePoints() )
{
corner.x = (int) aBoolengine->GetPolygonXPoint();
corner.y = (int) aBoolengine->GetPolygonYPoint();
corner.end_contour = false;
// Flag this corner if starting a hole connection segment:
// This is used by draw functions to draw only useful segments (and not extra segments)
corner.utility =
(aBoolengine->GetPolygonPointEdgeType() ==
KB_FALSE_EDGE) ? 1 : 0;
m_FilledPolysList.push_back( corner );
count++;
}
corner.end_contour = true;
m_FilledPolysList.pop_back();
m_FilledPolysList.push_back( corner );
aBoolengine->EndPolygonGet();
}
return count;
}
void AddPolygonCornersToKPolygonList( std::vector <CPolyPt>& void AddPolygonCornersToKPolygonList( std::vector <CPolyPt>&
aCornersBuffer, aCornersBuffer,
KPolygonSet& aKPolyList ) KPolygonSet& aKPolyList )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment