/
polytech_kolomna
/
aipackaging
Обзор
Документация
Войти
/
polytech_kolomna
/
aipackaging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
FigureGenerator
src/data_format/processor.cpp
288 строк
7 KB
Olegh
Merge branch 'master' of https://gitverse.ru/polytech_kolomna/aipackaging into data_format
15 окт 2025, 00:21
15 окт 2025, 00:21
a226d21
Код
Авторство
О чём код?
#include <sstream> #include <processor.h> std::string extractor(const std::string& str, ExtractorOptions opt) { // Оставить только цифры if (opt == ExtractorOptions::NumbersOnly) { return extract_numbers(str); } // Оставить буквы и цифры else if (opt == ExtractorOptions::NumbersAndLetters) { return extract_numbers_and_letters(str); } else { return ""; } } std::string extract_numbers(const std::string& str) { // Временная строка, в которую запишется результат std::string result(""); for (int i = 0; i < str.size(); i++) { // Если символ цифра - добавляем в строку if (str[i] >= '0' && str[i] <= '9' || str[i] == '-' || str[i] == '.') { result += str[i]; } // Иначе - пропускаем символы, пока снова не встретится цифра, и ставим пробел (если строка не пустая) else { while (!(str[i] >= '0' && str[i] <= '9' || str[i] == '-' || str[i] == '.') && i < str.size()) { i++; } if (result.size() > 0 && i < str.size()) result += ' '; i--; } } return result; } std::string extract_numbers_and_letters(const std::string& str) { // Временная строка, в которую запишется результат std::string result(""); for (int i = 0; i < str.size(); i++) { // Если символ цифра или буква - добавляем в строку if (str[i] >= '0' && str[i] <= '9' || str[i] >= 'A' && str[i] <= 'Z' || str[i] == '-' || str[i] == '.') { result += str[i]; } // Иначе - пропускаем символы, пока снова не встретится цифра, и ставим пробел (если строка не пустая) else { while (!(str[i] >= '0' && str[i] <= '9' || str[i] >= 'A' && str[i] <= 'Z' || str[i] == '-' || str[i] == '.') && i < str.size()) { i++; } if (result.size() > 0 && i < str.size()) result += ' '; i--; } } return result; } void Processor::deserialize(const std::string& str) { std::stringstream ss(str); // Временная строка для записи частей строки из потока std::string buffer; ss >> buffer; if (!buffer.compare("CREATE_CELL")) { create_cell(ss, buffer); } else if (!buffer.compare("CREATE_FIGURE")) { create_figure(ss, buffer); } else { std::cout << "Incorrect format!\n"; } } void Processor::create_cell(std::stringstream& ss, std::string& buffer) { buffer.clear(); std::string array_part, id_part; // Извлечение части строки с описанием контура. // Так как эта часть отделяется от части с возвращаемым значением строкой "->" - извлечение происходит до тех пор, пока она не встретится. ss >> buffer; while (buffer.compare("->")) { array_part += ' ' + buffer; ss >> buffer; } ss >> id_part; // Получение ID клетки int id = std::stoi(extractor(id_part, ExtractorOptions::NumbersOnly)); // Создание базовой клетки Cell c(id); // Очистка строки-массива от лишнего array_part = extractor(array_part, ExtractorOptions::NumbersAndLetters); // Если ячейка пустая, то в array_part ничего не запишется, соответвтенно размер этой строки будет равен 0. // Это условие используется для проверки ячейки на пустоту. if (array_part.size() > 1) { fill_cell(array_part, c); } cells[id] = c; } void Processor::fill_cell(const std::string& array_part, Cell& c) { std::stringstream arr_stream(array_part); std::string buffer; int x1{}, y1{}, x2{}, y2{}; while (arr_stream >> buffer) { if (!buffer.compare("LINE")) { int x{}, y{}; double a{}, b{}, min{}, max{}; arr_stream >> x >> y >> a >> b >> min >> max; Point2D coords(x, y); Line2D l(coords, Vector2D{ a, b }); c.add_line(std::make_shared<BoundedCurve2D>(std::make_shared<Line2D>(l), min, max)); } else if (!buffer.compare("CIRCLE")) { int x{}, y{}; double r{}; arr_stream >> x >> y >> r; Point2D coords(x, y); Circle2D circle(coords, r); c.add_line(std::make_shared<BoundedCurve2D>(std::make_shared<Circle2D>(circle), 0, 0)); } else if (!buffer.compare("ARC")) { int x{}, y{}; double r{}, min{}, max{}; arr_stream >> x >> y >> r >> min >> max; Point2D coords(x, y); Circle2D circle(coords, r); c.add_line(std::make_shared<BoundedCurve2D>(std::make_shared<Circle2D>(circle), min, max)); } else { std::cout << "Incorrect format!"; return; } buffer.clear(); } } void Processor::create_figure(std::stringstream& ss, std::string& buffer) { buffer.clear(); std::string array_part, id_part; // Извлечение части строки с перечислением ID ячеек и их координат. // Так как эта часть отделяется от части с возвращаемым значением строкой "->" - извлечение происходит до тех пор, пока она не встретится. ss >> buffer; while (buffer.compare("->")) { array_part += ' ' + buffer; ss >> buffer; } ss >> id_part; // Получение ID фигуры int fig_id = std::stoi(extractor(id_part, ExtractorOptions::NumbersOnly)); // Создание пустой фигуры Figure fig; // Очистка array_part от лишнего array_part = extractor(array_part, ExtractorOptions::NumbersOnly); // Если фигура пустая, то в array_part запишется только ID, соответвтенно размер этой строки будет равен 1. // Это условие используется для проверки фигуры на пустоту. // Добавление ячеек в фигуру if (array_part.size() > 1) { fill_figure(array_part, fig); } figures[fig_id] = fig; } void Processor::fill_figure(const std::string& array_part, Figure& f) { std::stringstream arr_stream(array_part); std::string buffer; int cell_id{}, x{}, y{}; while (arr_stream >> buffer) { cell_id = std::stoi(extractor(buffer, ExtractorOptions::NumbersOnly)); arr_stream >> x >> y; // Получение ячейки из вектора по ID Cell cell = cells[cell_id]; f.add_cell(cell, Point2D(x, y)); buffer.clear(); } } Cell Processor::get_cell(int n) const { return cells.at(n); } Figure Processor::get_figure(int n) const { return figures.at(n); } void Processor::write_file(const std::string& path) const { std::ofstream of(path); for (const auto& p : cells) { of << p.second.to_aipon() << '\n'; } for (const auto& p : figures) { of << p.second.to_aipon() << '\n'; } of.close(); }