From f6e42ba8f7df9999d201245622b475f74f82f41f Mon Sep 17 00:00:00 2001 From: grigo Date: Tue, 9 Dec 2025 13:04:04 +0300 Subject: [PATCH] Add PCB document filename handling in AltiumParser and SpecificationPCBController. Updated .gitignore and app_icon.rc for consistency. Enhanced PDF rendering with proper resolution handling. --- .gitignore | 1 + app_icon.rc | 1 + controller/altiumparser.cpp | 13 ++ controller/altiumparser.h | 3 + controller/maincontroller.cpp | 11 ++ controller/pdfcontroller.cpp | 121 +++++++++++++------ controller/specificationpcbcontroller.cpp | 140 +++++++++++++++++++--- controller/specificationpcbcontroller.h | 5 + 8 files changed, 241 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index dab4086..11087bb 100644 --- a/.gitignore +++ b/.gitignore @@ -136,3 +136,4 @@ ENV/ *.pdfprj.bak *.backup + diff --git a/app_icon.rc b/app_icon.rc index 39c0d4a..0443bfe 100644 --- a/app_icon.rc +++ b/app_icon.rc @@ -2,3 +2,4 @@ IDI_ICON1 ICON DISCARDABLE "assets/icon2.ico" + diff --git a/controller/altiumparser.cpp b/controller/altiumparser.cpp index a0ee425..156cc7c 100644 --- a/controller/altiumparser.cpp +++ b/controller/altiumparser.cpp @@ -15,6 +15,7 @@ AltiumParser::AltiumParser(QObject *parent) , m_database(nullptr) , m_parseWatcher(nullptr) , m_isParsingAsync(false) + , m_pcbDocFileName("") { initializeRegex(); @@ -230,6 +231,9 @@ bool AltiumParser::parseProjectFile(const QString &filename, ComponentModel *mod emit parsingProgress(80); saveDataToDatabase(projectData); + // Сохраняем имя PcbDoc файла + m_pcbDocFileName = projectData.pcbDocFileName; + // Установка данных в модель emit parsingProgress(90); setupModelData(projectData, model); @@ -420,6 +424,10 @@ void AltiumParser::parsePcbDocFiles(const QString &prjStr, const QString &filena if (QFile::exists(pcbPath)) { bool parseResult = parsePcbDocFile(pcbPath, data.pcbDielMaterials, data.pcbLayerCount); + // Сохраняем имя PcbDoc файла + if (parseResult) { + data.pcbDocFileName = pcbPath; + } } } } @@ -771,6 +779,11 @@ void AltiumParser::clearError() m_lastError.clear(); } +QString AltiumParser::getPcbDocFileName() const +{ + return m_pcbDocFileName; +} + void AltiumParser::initializeRegex() { // Инициализация регулярных выражений для парсинга diff --git a/controller/altiumparser.h b/controller/altiumparser.h index 04a4d29..507d989 100644 --- a/controller/altiumparser.h +++ b/controller/altiumparser.h @@ -61,6 +61,7 @@ struct ProjectData { // PCB данные int pcbLayerCount; QList pcbDielMaterials; + QString pcbDocFileName; // Имя PcbDoc файла // Переменные состояния парсинга bool isWaitingVariantDescription = false; @@ -86,6 +87,7 @@ public: // Парсинг специфичных форматов Altium bool parseSchDoc(const QString &filename, ComponentModel *model); bool parsePcbDoc(const QString &filename, ComponentModel *model); + QString getPcbDocFileName() const; // Получить имя PcbDoc файла после парсинга проекта bool parseCsvBom(const QString &filename, ComponentModel *model); bool parseXlsBom(const QString &filename, ComponentModel *model); bool parsePrjPcbFile(const QString &filename, ComponentModel *model); @@ -180,6 +182,7 @@ private: QList m_projectParamsList; QStringList m_variantNamesList; bool m_isPcbMultilayer; + QString m_pcbDocFileName; // Имя PcbDoc файла после парсинга проекта // База данных для хранения компонентов DataBaseController *m_database; diff --git a/controller/maincontroller.cpp b/controller/maincontroller.cpp index 6e36558..fbb980a 100644 --- a/controller/maincontroller.cpp +++ b/controller/maincontroller.cpp @@ -523,12 +523,23 @@ bool MainController::parseFile(const QString &filePath) { // Создаем временную модель для парсинга ComponentModel tempModel; success = m_altiumParser->parsePrjPcbFile(filePath, &tempModel); + // Сохраняем имя PcbDoc файла в контроллере спецификации, если оно было найдено + if (success && m_specificationPCBController) { + QString pcbDocFileName = m_altiumParser->getPcbDocFileName(); + if (!pcbDocFileName.isEmpty()) { + m_specificationPCBController->setPcbDocFileName(pcbDocFileName); + } + } } else if (extension == "schdoc") { ComponentModel tempModel; success = m_altiumParser->parseSchDoc(filePath, &tempModel); } else if (extension == "pcbdoc") { ComponentModel tempModel; success = m_altiumParser->parsePcbDoc(filePath, &tempModel); + // Сохраняем имя PcbDoc файла в контроллере спецификации + if (success && m_specificationPCBController) { + m_specificationPCBController->setPcbDocFileName(filePath); + } } else if (extension == "csv") { ComponentModel tempModel; success = m_altiumParser->parseCsvBom(filePath, &tempModel); diff --git a/controller/pdfcontroller.cpp b/controller/pdfcontroller.cpp index 7ee5c9e..17bc08a 100644 --- a/controller/pdfcontroller.cpp +++ b/controller/pdfcontroller.cpp @@ -29,6 +29,27 @@ Q_DECLARE_METATYPE(VedomostCellData) #include #include #include +#include +#include + +// Вспомогательная функция для получения правильного разрешения устройства +// Для QPdfWriter использует resolution(), для других устройств - logicalDpiX() +static qreal getDeviceResolution(QPaintDevice *device) +{ + if (!device) { + return 96.0; // Значение по умолчанию + } + + // QPdfWriter наследуется от QPaintDevice + // Используем dynamic_cast (QPaintDevice имеет виртуальные функции в Qt) + QPdfWriter *pdfWriter = dynamic_cast(device); + if (pdfWriter) { + return pdfWriter->resolution(); + } + + // Если dynamic_cast не сработал, используем logicalDpiX() + return device->logicalDpiX(); +} PDFController::PDFController(QObject *parent) : QObject{parent} @@ -625,11 +646,16 @@ bool PDFController::createPdfDocument(const QString &filePath, const QString &ti bool PDFController::addListRegistrationTable(QPainter &painter, const QRectF &pageRect) { - QPen framePen(Qt::black, 1.0); + // Используем правильное разрешение для PDF + qreal resolution = getDeviceResolution(painter.device()); + qreal mmToPixels = resolution / 25.4; + // Используем физические единицы для PDF (0.5 мм для рамок) + QPen framePen(Qt::black, 0.5 * mmToPixels); + framePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(framePen); // Конвертируем миллиметры в пиксели - qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; + float rowHeight = 8.175; int rowCount = 29; @@ -718,11 +744,14 @@ bool PDFController::addGostFrameA4FirstPage(QPainter &painter, const QRectF &pag // Рисуем только внутреннюю рамку ГОСТ с отступами: // Слева: 20мм, Сверху: 5мм, Справа: 5мм, Снизу: 5мм - QPen framePen(Qt::black, 1.0); + // Используем правильное разрешение для PDF + qreal resolution = getDeviceResolution(painter.device()); + qreal mmToPixels = resolution / 25.4; // 25.4 мм = 1 дюйм + // Используем физические единицы для PDF (0.5 мм для рамок ГОСТ) + QPen framePen(Qt::black, 0.5 * mmToPixels); + framePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(framePen); - - // Конвертируем миллиметры в пиксели - qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; // 25.4 мм = 1 дюйм + // Вычисляем отступы в пикселях qreal leftMargin = 20 * mmToPixels; // 20мм слева @@ -978,11 +1007,12 @@ bool PDFController::addGostFrameA4(QPainter &painter, const QRectF &pageRect, co // Рисуем только внутреннюю рамку ГОСТ с отступами: // Слева: 20мм, Сверху: 5мм, Справа: 5мм, Снизу: 5мм - QPen framePen(Qt::black, 1.0); + qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; // 25.4 мм = 1 дюйм + // Используем физические единицы для PDF (0.5 мм для рамок ГОСТ) + QPen framePen(Qt::black, 0.5 * mmToPixels); + framePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(framePen); - // Конвертируем миллиметры в пиксели - qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; // 25.4 мм = 1 дюйм // Вычисляем отступы в пикселях qreal leftMargin = 20 * mmToPixels; // 20мм слева @@ -1149,11 +1179,14 @@ bool PDFController::addGostFrameA3FirstPage(QPainter &painter, const QRectF &pag // Рисуем только внутреннюю рамку ГОСТ с отступами: // Слева: 20мм, Сверху: 5мм, Справа: 5мм, Снизу: 5мм - QPen framePen(Qt::black, 1.0); + // Используем правильное разрешение для PDF + qreal resolution = getDeviceResolution(painter.device()); + qreal mmToPixels = resolution / 25.4; // 25.4 мм = 1 дюйм + // Используем физические единицы для PDF (0.5 мм для рамок ГОСТ) + QPen framePen(Qt::black, 0.5 * mmToPixels); + framePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(framePen); - // Конвертируем миллиметры в пиксели - qreal mmToPixels = (painter.device()->logicalDpiY() / 25.4); // 25.4 мм = 1 дюйм // Вычисляем отступы в пикселях qreal leftMargin = 20 * mmToPixels; // 20мм слева @@ -1335,12 +1368,12 @@ bool PDFController::addGostFrameA3(QPainter &painter, const QRectF &pageRect, co { // Рисуем только внутреннюю рамку ГОСТ с отступами: // Слева: 20мм, Сверху: 5мм, Справа: 5мм, Снизу: 5мм - QPen framePen(Qt::black, 1.0); + qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; + // Используем физические единицы для PDF (0.5 мм для рамок ГОСТ) + QPen framePen(Qt::black, 0.5 * mmToPixels); + framePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(framePen); - // Конвертируем миллиметры в пиксели - qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; // 25.4 мм = 1 дюйм - // Вычисляем отступы в пикселях qreal leftMargin = 20 * mmToPixels; // 20мм слева qreal topMargin = 5 * mmToPixels; // 5мм сверху @@ -1495,8 +1528,15 @@ bool PDFController::addPerechenTableRange(QPainter &painter, PerechenTableModel return false; } - // Рисуем рамку таблицы - QPen tablePen(Qt::black, 1.0); + // Размеры колонок в миллиметрах (конвертируем в пиксели) + // Используем правильное разрешение для PDF + qreal resolution = getDeviceResolution(painter.device()); + qreal mmToPixels = resolution / 25.4; + + // Рисуем рамку таблицы с увеличенной толщиной (0.5 мм = примерно в 5 раз толще) + // Используем ту же толщину, что и для рамок ГОСТ, чтобы линии были заметными + QPen tablePen(Qt::black, 0.5 * mmToPixels); + tablePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(tablePen); // Настройки шрифта для таблицы - получаем из настроек проекта @@ -1512,9 +1552,6 @@ bool PDFController::addPerechenTableRange(QPainter &painter, PerechenTableModel // Заголовки колонок QStringList headers = {"Поз.", "Наименование", "Кол.", "Примечание"}; - // Размеры колонок в миллиметрах (конвертируем в пиксели) - qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; - qreal posWidth = 20 * mmToPixels; // Поз.: 20мм qreal nameWidth = 110 * mmToPixels; // Наименование: 110мм qreal qtyWidth = 10 * mmToPixels; // Кол.: 10мм @@ -2080,8 +2117,15 @@ bool PDFController::addSpecificationPcbTableRange(QPainter &painter, Specificati return false; } - // Рисуем рамку таблицы - QPen tablePen(Qt::black, 1.0); + // Размеры колонок в миллиметрах (конвертируем в пиксели) + // Используем правильное разрешение для PDF + qreal resolution = getDeviceResolution(painter.device()); + qreal mmToPixels = resolution / 25.4; + + // Рисуем рамку таблицы с увеличенной толщиной (0.5 мм = примерно в 5 раз толще) + // Используем ту же толщину, что и для рамок ГОСТ, чтобы линии были заметными + QPen tablePen(Qt::black, 0.5 * mmToPixels); + tablePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(tablePen); // Настройки шрифта для таблицы - получаем из настроек проекта @@ -2097,9 +2141,6 @@ bool PDFController::addSpecificationPcbTableRange(QPainter &painter, Specificati // Заголовки колонок для спецификации PCB QStringList headers = {"Формат", "Зона", "Поз.", "Обозначение", "Наименование", "Кол.", "Примечание"}; - // Размеры колонок в миллиметрах (конвертируем в пиксели) - qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; - qreal formatWidth = 6 * mmToPixels; // Формат: 15мм qreal zoneWidth = 6 * mmToPixels; // Зона: 15мм qreal posWidth = 8 * mmToPixels; // Поз.: 15мм @@ -2348,8 +2389,15 @@ bool PDFController::addSpecificationTableRange(QPainter &painter, SpecificationT return false; } - // Рисуем рамку таблицы - QPen tablePen(Qt::black, 1.0); + // Размеры колонок в миллиметрах (конвертируем в пиксели) + // Используем правильное разрешение для PDF + qreal resolution = getDeviceResolution(painter.device()); + qreal mmToPixels = resolution / 25.4; + + // Рисуем рамку таблицы с увеличенной толщиной (0.5 мм = примерно в 5 раз толще) + // Используем ту же толщину, что и для рамок ГОСТ, чтобы линии были заметными + QPen tablePen(Qt::black, 0.5 * mmToPixels); + tablePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(tablePen); // Настройки шрифта для таблицы - получаем из настроек проекта @@ -2365,9 +2413,6 @@ bool PDFController::addSpecificationTableRange(QPainter &painter, SpecificationT // Заголовки колонок для спецификации материалов QStringList headers = {"Формат", "Зона", "Поз.", "Обозначение", "Наименование", "Кол.", "Примечание"}; - // Размеры колонок в миллиметрах (конвертируем в пиксели) - qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; - qreal formatWidth = 6 * mmToPixels; // Формат: 15мм qreal zoneWidth = 6 * mmToPixels; // Зона: 15мм qreal posWidth = 8 * mmToPixels; // Поз.: 15мм @@ -2616,8 +2661,15 @@ bool PDFController::addVedomostTableRange(QPainter &painter, VedomostTableModel return false; } - // Рисуем рамку таблицы - QPen tablePen(Qt::black, 1.0); + // Размеры колонок в миллиметрах (конвертируем в пиксели) для А5 формата + // Используем правильное разрешение для PDF + qreal resolution = getDeviceResolution(painter.device()); + qreal mmToPixels = resolution / 25.4; + + // Рисуем рамку таблицы с увеличенной толщиной (0.5 мм = примерно в 5 раз толще) + // Используем ту же толщину, что и для рамок ГОСТ, чтобы линии были заметными + QPen tablePen(Qt::black, 0.5 * mmToPixels); + tablePen.setCosmetic(false); // Важно для PDF - использовать физические единицы painter.setPen(tablePen); // Настройки шрифта для таблицы - получаем из настроек проекта @@ -2634,9 +2686,6 @@ bool PDFController::addVedomostTableRange(QPainter &painter, VedomostTableModel QStringList headers = {"№ строки","Наименование", "Код продукции", "Обозначение документа на поставку", "Поставщик", "Куда входит (обозначение)", "Количество на изделие", "Количество в комплекте", "Количество на регулир", "Количество всего", "Примечание"}; - - // Размеры колонок в миллиметрах (конвертируем в пиксели) для А5 формата - qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; qreal nnRowWidth = 7*mmToPixels; qreal nameWidth = 60 * mmToPixels; // Наименование qreal productCodeWidth = 45 * mmToPixels; // Код продукции diff --git a/controller/specificationpcbcontroller.cpp b/controller/specificationpcbcontroller.cpp index ea20715..387c401 100644 --- a/controller/specificationpcbcontroller.cpp +++ b/controller/specificationpcbcontroller.cpp @@ -14,6 +14,7 @@ SpecificationPCBController::SpecificationPCBController(QObject *parent) , m_designatorMappingModel(nullptr) , m_projectSettingsModel(nullptr) , m_mainController(nullptr) + , m_pcbDocFileName("") { // Устанавливаем маппинг по умолчанию для спецификации платы m_columnMappings << "Format" << "Zone" << "Position" << "Designator" << "Name" << "Quantity" << "Value"; @@ -143,27 +144,50 @@ void SpecificationPCBController::generateTableFromComponents() SpecificationPCBRowData defaultRow5; defaultRow5.isHeader = false; - defaultRow5.format = SpecificationPCBCellData("A3", 0, 1, true); - defaultRow5.zone = SpecificationPCBCellData("", 0, 1, true); - defaultRow5.position = SpecificationPCBCellData("", 0, 1, true); - defaultRow5.designation = SpecificationPCBCellData(getDecimalNumberBoard()+" Д33", 0, 1, true); - defaultRow5.name = SpecificationPCBCellData("Данные проектирования модуля", 0, 1, true); - defaultRow5.quantity = SpecificationPCBCellData("", 0, 1, true); - defaultRow5.note = SpecificationPCBCellData("", 0, 1, true); + defaultRow5.format = SpecificationPCBCellData("*)", 0, 1, false); + defaultRow5.zone = SpecificationPCBCellData("", 0, 1, false); + defaultRow5.position = SpecificationPCBCellData("", 0, 1, false); + defaultRow5.designation = SpecificationPCBCellData(getDecimalNumberBoard()+" Д33", 0, 1, false); + defaultRow5.name = SpecificationPCBCellData("Данные результатов проектирования", 0, 1, false); + defaultRow5.quantity = SpecificationPCBCellData("", 0, 1, false); + defaultRow5.note = SpecificationPCBCellData("DVD диск", 0, 1, false); m_tableModel->addRow(defaultRow5); m_tableModel->addRow(emptyRow); - SpecificationPCBRowData headerRow2; - headerRow2.isHeader = true; - headerRow2.format = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); - headerRow2.zone = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); - headerRow2.position = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); - headerRow2.designation = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); - headerRow2.name = SpecificationPCBCellData("Сборочные единицы", 0, 1, true, false, false, 100, true); - headerRow2.quantity = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); - headerRow2.note = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); - m_tableModel->addRow(headerRow2); + SpecificationPCBRowData defaultRow5_1; + defaultRow5_1.isHeader = false; + defaultRow5_1.format = SpecificationPCBCellData("А4", 0, 1, false); + defaultRow5_1.zone = SpecificationPCBCellData("", 0, 1, false); + defaultRow5_1.position = SpecificationPCBCellData("", 0, 1, false); + defaultRow5_1.designation = SpecificationPCBCellData(getDecimalNumberBoard()+" Д10-УЛ", 0, 1, false); + defaultRow5_1.name = SpecificationPCBCellData("Удостоверяющий лист", 0, 1, false); + defaultRow5_1.quantity = SpecificationPCBCellData("", 0, 1, false); + defaultRow5_1.note = SpecificationPCBCellData("Размножать", 0, 1, false); + m_tableModel->addRow(defaultRow5_1); + SpecificationPCBRowData defaultRow5_2; + defaultRow5_2.isHeader = false; + defaultRow5_2.format = SpecificationPCBCellData("", 0, 1, false); + defaultRow5_2.zone = SpecificationPCBCellData("", 0, 1, false); + defaultRow5_2.position = SpecificationPCBCellData("", 0, 1, false); + defaultRow5_2.designation = SpecificationPCBCellData("", 0, 1, false); + defaultRow5_2.name = SpecificationPCBCellData("Данные результатов проектирования", 0, 1, false); + defaultRow5_2.quantity = SpecificationPCBCellData("", 0, 1, false); + defaultRow5_2.note = SpecificationPCBCellData("по указанию", 0, 1, false); + m_tableModel->addRow(defaultRow5_2); + m_tableModel->addRow(emptyRow); + SpecificationPCBRowData headerRow2_4; + headerRow2_4.isHeader = true; + headerRow2_4.format = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_4.zone = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_4.position = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_4.designation = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_4.name = SpecificationPCBCellData("Сборочные единицы", 0, 1, true, false, false, 100, true); + headerRow2_4.quantity = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_4.note = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + m_tableModel->addRow(headerRow2_4); + + m_tableModel->addRow(emptyRow); @@ -180,6 +204,28 @@ void SpecificationPCBController::generateTableFromComponents() m_tableModel->addRow(emptyRow); + SpecificationPCBRowData headerRow2_1; + headerRow2_1.isHeader = true; + headerRow2_1.format = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_1.zone = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_1.position = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_1.designation = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_1.name = SpecificationPCBCellData("Стандартные изделия", 0, 1, true, false, false, 100, true); + headerRow2_1.quantity = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2_1.note = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + m_tableModel->addRow(headerRow2_1); + m_tableModel->addRow(emptyRow); + SpecificationPCBRowData headerRow2; + headerRow2.isHeader = true; + headerRow2.format = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2.zone = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2.position = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2.designation = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2.name = SpecificationPCBCellData("Детали", 0, 1, true, false, false, 100, true); + headerRow2.quantity = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + headerRow2.note = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); + m_tableModel->addRow(headerRow2); + SpecificationPCBRowData headerRow3; headerRow3.isHeader = true; headerRow3.format = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); @@ -188,7 +234,7 @@ void SpecificationPCBController::generateTableFromComponents() headerRow3.designation = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); headerRow3.name = SpecificationPCBCellData("Прочие изделия", 0, 1, true, false, false, 100, true); - int pos1 = 1; + int pos1 = 2; m_tableModel->addRow(headerRow3); @@ -493,6 +539,53 @@ void SpecificationPCBController::generateTableFromComponents() } catch (...) { qDebug() << "SpecificationPCBController::generateTableFromComponents: Неизвестная ошибка при генерации"; } + m_tableModel->addRow(emptyRow); + SpecificationPCBRowData defaultRow6; + defaultRow6.isHeader = false; + defaultRow6.format = SpecificationPCBCellData("", 0, 1, false); + defaultRow6.zone = SpecificationPCBCellData("", 0, 1, false); + defaultRow6.position = SpecificationPCBCellData("", 0, 1, false); + defaultRow6.designation = SpecificationPCBCellData("", 0, 1, false); + defaultRow6.name = SpecificationPCBCellData("Примечание", 0, 1, false); + defaultRow6.quantity = SpecificationPCBCellData("", 0, 1, false); + defaultRow6.note = SpecificationPCBCellData("", 0, 1, false); + m_tableModel->addRow(defaultRow6); + SpecificationPCBRowData defaultRow6_1; + defaultRow6_1.isHeader = false; + defaultRow6_1.format = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_1.zone = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_1.position = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_1.designation = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_1.name = SpecificationPCBCellData("Изготовить плату печатную", 0, 1, false); + defaultRow6_1.quantity = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_1.note = SpecificationPCBCellData("", 0, 1, false); + m_tableModel->addRow(defaultRow6_1); + SpecificationPCBRowData defaultRow6_2; + defaultRow6_2.isHeader = false; + defaultRow6_2.format = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_2.zone = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_2.position = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_2.designation = SpecificationPCBCellData("", 0, 1, false); + // Формируем строку "По файлу" с именем PcbDoc файла, если оно есть + QString fileText = "По файлу"; + if (!m_pcbDocFileName.isEmpty()) { + QFileInfo fileInfo(m_pcbDocFileName); + fileText = "По файлу " + fileInfo.fileName(); + } + defaultRow6_2.name = SpecificationPCBCellData(fileText, 0, 1, false); + defaultRow6_2.quantity = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_2.note = SpecificationPCBCellData("", 0, 1, false); + m_tableModel->addRow(defaultRow6_2); + SpecificationPCBRowData defaultRow6_3; + defaultRow6_3.isHeader = false; + defaultRow6_3.format = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_3.zone = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_3.position = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_3.designation = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_3.name = SpecificationPCBCellData("из состава"+getDecimalNumberBoard()+" Д10", 0, 1, false); + defaultRow6_3.quantity = SpecificationPCBCellData("", 0, 1, false); + defaultRow6_3.note = SpecificationPCBCellData("", 0, 1, false); + m_tableModel->addRow(defaultRow6_3); } void SpecificationPCBController::updateTableFromComponents() @@ -799,6 +892,17 @@ void SpecificationPCBController::setBoardName(const QString &value) setColumnMappings(mappings); } +void SpecificationPCBController::setPcbDocFileName(const QString &fileName) +{ + m_pcbDocFileName = fileName; + qDebug() << "SpecificationPCBController::setPcbDocFileName: Установлено имя файла:" << fileName; +} + +QString SpecificationPCBController::getPcbDocFileName() const +{ + return m_pcbDocFileName; +} + void SpecificationPCBController::setColumnMappings(const QStringList &mappings) { qDebug() << "SpecificationPCBController::setColumnMappings: Устанавливаем новые настройки колонок:" << mappings; diff --git a/controller/specificationpcbcontroller.h b/controller/specificationpcbcontroller.h index 06d32c5..cea27ca 100644 --- a/controller/specificationpcbcontroller.h +++ b/controller/specificationpcbcontroller.h @@ -71,6 +71,10 @@ public: // Методы для работы с названием платы QString getBoardName() const; void setBoardName(const QString &value); + + // Методы для работы с именем PcbDoc файла + void setPcbDocFileName(const QString &fileName); + QString getPcbDocFileName() const; private: QString getComponentValue(ComponentModel *component, const QString &propertyName); @@ -107,6 +111,7 @@ private: QList m_components; QStringList m_columnMappings; QStringList m_propertyNames; + QString m_pcbDocFileName; // Имя PcbDoc файла }; #endif // SPECIFICATIONPCBCONTROLLER_H