/
klischa
/
AstraScanner2
Обзор
Документация
Войти
/
klischa
/
AstraScanner2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/project/ProjectManager.h
120 строк
5 KB
klischa
fix: 11 исправлений — заголовки, M_PI, CUDA, потоки, проект, Poisson
19 июн 2026, 22:10
19 июн 2026, 22:10
e910da5
Код
Авторство
О чём код?
#ifndef PROJECTMANAGER_H #define PROJECTMANAGER_H #include <QObject> #include <QString> #include <QVector> #include <QDateTime> #include <QDir> #include <QMutex> #include <pcl/point_cloud.h> #include <Eigen/Geometry> #include <pcl/point_types.h> // Директория для AI временных файлов (промежуточные результаты) constexpr const char *kAiTempSubdir = "ai_temp"; // Одна единица скана внутри проекта: облако точек + метаданные. struct ScanItem { QString name; // пользовательское имя QString relativeFilePath; // относительный путь к .ply внутри директории проекта QDateTime createdAt; int pointCount = 0; pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud; // загружено в память (может быть null до load) }; // --- Режим трекинга --- enum class TrackingMode : int { ICP = 0, // Использовать ICP для регистрации MarkerBased = 1, // Использовать оптический трекинг по маркерам NeuralBased = 2 // Использовать нейросетевой трекинг }; // Проект — это директория со следующим layout: // <projectDir>/ // project.json — метаданные, список сканов // scans/ // scan_<timestamp>.ply // ... // mesh.ply — (опционально) реконструированный меш // // ProjectManager владеет текущим проектом и списком сканов. Сохранение — // сериализация в project.json + запись PLY для каждого облака. class ProjectManager : public QObject { Q_OBJECT public: explicit ProjectManager(QObject *parent = nullptr); // --- Управление проектом --- bool newProject(const QString &projectDir, const QString &name = QString()); bool openProject(const QString &projectDir); bool saveProject(); bool saveProjectAs(const QString &projectDir); void closeProject(); bool isOpen() const; bool isDirty() const; QString projectDir() const; QString projectName() const; // --- Сканы --- // Добавляет облако в проект как новый скан. Облако *копируется* (shallow), // затем сохраняется на диск в scans/ внутри директории проекта. Возвращает // индекс добавленного элемента или -1 при ошибке. int addScan(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr &cloud, const QString &name = QString()); bool removeScan(int index); bool renameScan(int index, const QString &newName); QVector<ScanItem> scans() const; int scanCount() const; // Возвращает облако — при необходимости подгружает из файла. pcl::PointCloud<pcl::PointXYZRGB>::Ptr scanCloud(int index); // Обновляет облако существующего скана (in-place). cloud должен быть валидным. bool setScanCloud(int index, const pcl::PointCloud<pcl::PointXYZRGB>::Ptr &cloud); // --- Режим трекинга --- void setTrackingMode(TrackingMode mode); TrackingMode getTrackingMode() const; // Текущая поза сканера (в глобальной системе координат) void setScannerPose(const Eigen::Affine3f& pose); Eigen::Affine3f getScannerPose() const; QString lastError() const; // AI временная директория для промежуточных артефактов QString aiTempDir() const { return m_projectDir.isEmpty() ? QString() : QDir(m_projectDir).filePath(kAiTempSubdir); } bool createAiTempDir(); signals: void projectChanged(); // метаданные или состояние dirty void scansChanged(); // добавлен/удалён/переименован скан private: QString metadataPath() const; QString scansDirPath() const; bool writeMetadata(); bool readMetadata(); bool saveScanToDisk(ScanItem &item); bool loadScanFromDisk(ScanItem &item); bool setDirty(bool dirty); QString m_projectDir; QString m_projectName; QVector<ScanItem> m_scans; bool m_dirty = false; QString m_lastError; TrackingMode m_trackingMode = TrackingMode::ICP; // Режим трекинга по умолчанию Eigen::Affine3f m_scanner_pose = Eigen::Affine3f::Identity(); // Поза сканера в глобальной СК // Мьютекс для синхронизации доступа к данным проекта из разных потоков mutable QMutex m_mutex; }; #endif // PROJECTMANAGER_H