You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.5 KiB
C++
122 lines
3.5 KiB
C++
|
1 month ago
|
//------------------------------------------------------------------------------
|
||
|
|
// Functions load clipping operations from text files
|
||
|
|
//------------------------------------------------------------------------------
|
||
|
|
|
||
|
|
#include "ClipFileLoad.h"
|
||
|
|
#include <sstream>
|
||
|
|
|
||
|
|
using namespace std;
|
||
|
|
using namespace Clipper2Lib;
|
||
|
|
|
||
|
|
bool GetInt(string::const_iterator& s_it,
|
||
|
|
const string::const_iterator& it_end, int64_t& value)
|
||
|
|
{
|
||
|
|
value = 0;
|
||
|
|
while (s_it != it_end && *s_it == ' ') ++s_it;
|
||
|
|
if (s_it == it_end) return false;
|
||
|
|
bool is_neg = (*s_it == '-');
|
||
|
|
if (is_neg) ++s_it;
|
||
|
|
string::const_iterator s_it2 = s_it;
|
||
|
|
while (s_it != it_end && *s_it >= '0' && *s_it <= '9')
|
||
|
|
{
|
||
|
|
value = value * 10 + static_cast<int64_t>(*s_it++) - 48;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (s_it == s_it2) return false; //no value
|
||
|
|
//trim trailing space and a comma if present
|
||
|
|
while (s_it != it_end && *s_it == ' ') ++s_it;
|
||
|
|
if (s_it != it_end && *s_it == ',') ++s_it;
|
||
|
|
if (is_neg) value = -value;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool GetPath(const string& line, Paths64& paths)
|
||
|
|
{
|
||
|
|
Path64 p;
|
||
|
|
int64_t x = 0, y = 0;
|
||
|
|
string::const_iterator s_it = line.cbegin(), s_end = line.cend();
|
||
|
|
while (GetInt(s_it, s_end, x) && GetInt(s_it, s_end, y))
|
||
|
|
p.push_back(Point64(x, y));
|
||
|
|
if (p.empty()) return false;
|
||
|
|
paths.push_back(p);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
void GetPaths(ifstream& source, Paths64& paths)
|
||
|
|
{
|
||
|
|
while (true)
|
||
|
|
{
|
||
|
|
string line;
|
||
|
|
stringstream::pos_type last_read_line_pos = source.tellg();
|
||
|
|
if (getline(source, line) && GetPath(line, paths))
|
||
|
|
continue;
|
||
|
|
last_read_line_pos -= 1; // workaround for LF vs LFCR (#764)
|
||
|
|
source.seekg(last_read_line_pos, ios_base::beg);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
bool LoadTestNum(ifstream &source, int test_num,
|
||
|
|
Paths64 &subj, Paths64 &subj_open, Paths64 &clip,
|
||
|
|
int64_t& area, int64_t& count, ClipType &ct, FillRule &fr)
|
||
|
|
{
|
||
|
|
string line;
|
||
|
|
area = 0; count = 0;
|
||
|
|
if (test_num <= 0) test_num = 1;
|
||
|
|
source.seekg(0, ios_base::beg);
|
||
|
|
subj.clear(); subj_open.clear(); clip.clear();
|
||
|
|
|
||
|
|
while (getline(source, line))
|
||
|
|
{
|
||
|
|
if (test_num)
|
||
|
|
{
|
||
|
|
if (line.find("CAPTION:") != string::npos) --test_num;
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (line.find("CAPTION:") != string::npos) break; // ie don't go beyond current test
|
||
|
|
|
||
|
|
else if (line.find("INTERSECTION") != string::npos)
|
||
|
|
ct = ClipType::Intersection;
|
||
|
|
else if (line.find("UNION") != string::npos)
|
||
|
|
ct = ClipType::Union;
|
||
|
|
else if (line.find("DIFFERENCE") != string::npos)
|
||
|
|
ct = ClipType::Difference;
|
||
|
|
else if (line.find("XOR") != string::npos)
|
||
|
|
ct = ClipType::Xor;
|
||
|
|
else if (line.find("EVENODD") != string::npos)
|
||
|
|
fr = FillRule::EvenOdd;
|
||
|
|
else if (line.find("NONZERO") != string::npos)
|
||
|
|
fr = FillRule::NonZero ;
|
||
|
|
else if (line.find("POSITIVE") != string::npos)
|
||
|
|
fr = FillRule::Positive;
|
||
|
|
else if (line.find("NEGATIVE") != string::npos)
|
||
|
|
fr = FillRule::Negative;
|
||
|
|
else if (line.find("SOL_AREA") != string::npos)
|
||
|
|
{
|
||
|
|
string::const_iterator s_it, s_end = line.cend();
|
||
|
|
s_it = (line.cbegin() + 10);
|
||
|
|
GetInt(s_it, s_end, area);
|
||
|
|
}
|
||
|
|
else if (line.find("SOL_COUNT") != string::npos)
|
||
|
|
{
|
||
|
|
string::const_iterator s_it, s_end = line.cend();
|
||
|
|
s_it = (line.cbegin() + 11);
|
||
|
|
GetInt(s_it, s_end, count);
|
||
|
|
}
|
||
|
|
else if (line.find("SUBJECTS_OPEN") != string::npos)
|
||
|
|
{
|
||
|
|
GetPaths(source, subj_open);
|
||
|
|
}
|
||
|
|
else if (line.find("SUBJECTS") != string::npos)
|
||
|
|
{
|
||
|
|
GetPaths(source, subj);
|
||
|
|
}
|
||
|
|
else if (line.find("CLIPS") != string::npos)
|
||
|
|
{
|
||
|
|
GetPaths(source, clip);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return !test_num;
|
||
|
|
}
|