Add PCB document filename handling in AltiumParser and SpecificationPCBController. Updated .gitignore and app_icon.rc for consistency. Enhanced PDF rendering with proper resolution handling.

This commit is contained in:
2025-12-09 13:04:04 +03:00
parent 3467003721
commit f6e42ba8f7
8 changed files with 241 additions and 54 deletions
+1
View File
@@ -136,3 +136,4 @@ ENV/
*.pdfprj.bak *.pdfprj.bak
*.backup *.backup
+1
View File
@@ -2,3 +2,4 @@ IDI_ICON1 ICON DISCARDABLE "assets/icon2.ico"
+13
View File
@@ -15,6 +15,7 @@ AltiumParser::AltiumParser(QObject *parent)
, m_database(nullptr) , m_database(nullptr)
, m_parseWatcher(nullptr) , m_parseWatcher(nullptr)
, m_isParsingAsync(false) , m_isParsingAsync(false)
, m_pcbDocFileName("")
{ {
initializeRegex(); initializeRegex();
@@ -230,6 +231,9 @@ bool AltiumParser::parseProjectFile(const QString &filename, ComponentModel *mod
emit parsingProgress(80); emit parsingProgress(80);
saveDataToDatabase(projectData); saveDataToDatabase(projectData);
// Сохраняем имя PcbDoc файла
m_pcbDocFileName = projectData.pcbDocFileName;
// Установка данных в модель // Установка данных в модель
emit parsingProgress(90); emit parsingProgress(90);
setupModelData(projectData, model); setupModelData(projectData, model);
@@ -420,6 +424,10 @@ void AltiumParser::parsePcbDocFiles(const QString &prjStr, const QString &filena
if (QFile::exists(pcbPath)) { if (QFile::exists(pcbPath)) {
bool parseResult = parsePcbDocFile(pcbPath, data.pcbDielMaterials, data.pcbLayerCount); bool parseResult = parsePcbDocFile(pcbPath, data.pcbDielMaterials, data.pcbLayerCount);
// Сохраняем имя PcbDoc файла
if (parseResult) {
data.pcbDocFileName = pcbPath;
}
} }
} }
} }
@@ -771,6 +779,11 @@ void AltiumParser::clearError()
m_lastError.clear(); m_lastError.clear();
} }
QString AltiumParser::getPcbDocFileName() const
{
return m_pcbDocFileName;
}
void AltiumParser::initializeRegex() void AltiumParser::initializeRegex()
{ {
// Инициализация регулярных выражений для парсинга // Инициализация регулярных выражений для парсинга
+3
View File
@@ -61,6 +61,7 @@ struct ProjectData {
// PCB данные // PCB данные
int pcbLayerCount; int pcbLayerCount;
QList<DielProperty> pcbDielMaterials; QList<DielProperty> pcbDielMaterials;
QString pcbDocFileName; // Имя PcbDoc файла
// Переменные состояния парсинга // Переменные состояния парсинга
bool isWaitingVariantDescription = false; bool isWaitingVariantDescription = false;
@@ -86,6 +87,7 @@ public:
// Парсинг специфичных форматов Altium // Парсинг специфичных форматов Altium
bool parseSchDoc(const QString &filename, ComponentModel *model); bool parseSchDoc(const QString &filename, ComponentModel *model);
bool parsePcbDoc(const QString &filename, ComponentModel *model); bool parsePcbDoc(const QString &filename, ComponentModel *model);
QString getPcbDocFileName() const; // Получить имя PcbDoc файла после парсинга проекта
bool parseCsvBom(const QString &filename, ComponentModel *model); bool parseCsvBom(const QString &filename, ComponentModel *model);
bool parseXlsBom(const QString &filename, ComponentModel *model); bool parseXlsBom(const QString &filename, ComponentModel *model);
bool parsePrjPcbFile(const QString &filename, ComponentModel *model); bool parsePrjPcbFile(const QString &filename, ComponentModel *model);
@@ -180,6 +182,7 @@ private:
QList<ProjectParameterData> m_projectParamsList; QList<ProjectParameterData> m_projectParamsList;
QStringList m_variantNamesList; QStringList m_variantNamesList;
bool m_isPcbMultilayer; bool m_isPcbMultilayer;
QString m_pcbDocFileName; // Имя PcbDoc файла после парсинга проекта
// База данных для хранения компонентов // База данных для хранения компонентов
DataBaseController *m_database; DataBaseController *m_database;
+11
View File
@@ -523,12 +523,23 @@ bool MainController::parseFile(const QString &filePath) {
// Создаем временную модель для парсинга // Создаем временную модель для парсинга
ComponentModel tempModel; ComponentModel tempModel;
success = m_altiumParser->parsePrjPcbFile(filePath, &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") { } else if (extension == "schdoc") {
ComponentModel tempModel; ComponentModel tempModel;
success = m_altiumParser->parseSchDoc(filePath, &tempModel); success = m_altiumParser->parseSchDoc(filePath, &tempModel);
} else if (extension == "pcbdoc") { } else if (extension == "pcbdoc") {
ComponentModel tempModel; ComponentModel tempModel;
success = m_altiumParser->parsePcbDoc(filePath, &tempModel); success = m_altiumParser->parsePcbDoc(filePath, &tempModel);
// Сохраняем имя PcbDoc файла в контроллере спецификации
if (success && m_specificationPCBController) {
m_specificationPCBController->setPcbDocFileName(filePath);
}
} else if (extension == "csv") { } else if (extension == "csv") {
ComponentModel tempModel; ComponentModel tempModel;
success = m_altiumParser->parseCsvBom(filePath, &tempModel); success = m_altiumParser->parseCsvBom(filePath, &tempModel);
+85 -36
View File
@@ -29,6 +29,27 @@ Q_DECLARE_METATYPE(VedomostCellData)
#include <QTextOption> #include <QTextOption>
#include <QFontDatabase> #include <QFontDatabase>
#include <QDir> #include <QDir>
#include <typeinfo>
#include <cstring>
// Вспомогательная функция для получения правильного разрешения устройства
// Для QPdfWriter использует resolution(), для других устройств - logicalDpiX()
static qreal getDeviceResolution(QPaintDevice *device)
{
if (!device) {
return 96.0; // Значение по умолчанию
}
// QPdfWriter наследуется от QPaintDevice
// Используем dynamic_cast (QPaintDevice имеет виртуальные функции в Qt)
QPdfWriter *pdfWriter = dynamic_cast<QPdfWriter*>(device);
if (pdfWriter) {
return pdfWriter->resolution();
}
// Если dynamic_cast не сработал, используем logicalDpiX()
return device->logicalDpiX();
}
PDFController::PDFController(QObject *parent) PDFController::PDFController(QObject *parent)
: 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) 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); painter.setPen(framePen);
// Конвертируем миллиметры в пиксели // Конвертируем миллиметры в пиксели
qreal mmToPixels = painter.device()->logicalDpiX() / 25.4;
float rowHeight = 8.175; float rowHeight = 8.175;
int rowCount = 29; int rowCount = 29;
@@ -718,11 +744,14 @@ bool PDFController::addGostFrameA4FirstPage(QPainter &painter, const QRectF &pag
// Рисуем только внутреннюю рамку ГОСТ с отступами: // Рисуем только внутреннюю рамку ГОСТ с отступами:
// Слева: 20мм, Сверху: 5мм, Справа: 5мм, Снизу: 5мм // Слева: 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); painter.setPen(framePen);
// Конвертируем миллиметры в пиксели
qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; // 25.4 мм = 1 дюйм
// Вычисляем отступы в пикселях // Вычисляем отступы в пикселях
qreal leftMargin = 20 * mmToPixels; // 20мм слева qreal leftMargin = 20 * mmToPixels; // 20мм слева
@@ -978,11 +1007,12 @@ bool PDFController::addGostFrameA4(QPainter &painter, const QRectF &pageRect, co
// Рисуем только внутреннюю рамку ГОСТ с отступами: // Рисуем только внутреннюю рамку ГОСТ с отступами:
// Слева: 20мм, Сверху: 5мм, Справа: 5мм, Снизу: 5мм // Слева: 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); painter.setPen(framePen);
// Конвертируем миллиметры в пиксели
qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; // 25.4 мм = 1 дюйм
// Вычисляем отступы в пикселях // Вычисляем отступы в пикселях
qreal leftMargin = 20 * mmToPixels; // 20мм слева qreal leftMargin = 20 * mmToPixels; // 20мм слева
@@ -1149,11 +1179,14 @@ bool PDFController::addGostFrameA3FirstPage(QPainter &painter, const QRectF &pag
// Рисуем только внутреннюю рамку ГОСТ с отступами: // Рисуем только внутреннюю рамку ГОСТ с отступами:
// Слева: 20мм, Сверху: 5мм, Справа: 5мм, Снизу: 5мм // Слева: 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); painter.setPen(framePen);
// Конвертируем миллиметры в пиксели
qreal mmToPixels = (painter.device()->logicalDpiY() / 25.4); // 25.4 мм = 1 дюйм
// Вычисляем отступы в пикселях // Вычисляем отступы в пикселях
qreal leftMargin = 20 * mmToPixels; // 20мм слева qreal leftMargin = 20 * mmToPixels; // 20мм слева
@@ -1335,12 +1368,12 @@ bool PDFController::addGostFrameA3(QPainter &painter, const QRectF &pageRect, co
{ {
// Рисуем только внутреннюю рамку ГОСТ с отступами: // Рисуем только внутреннюю рамку ГОСТ с отступами:
// Слева: 20мм, Сверху: 5мм, Справа: 5мм, Снизу: 5мм // Слева: 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); painter.setPen(framePen);
// Конвертируем миллиметры в пиксели
qreal mmToPixels = painter.device()->logicalDpiX() / 25.4; // 25.4 мм = 1 дюйм
// Вычисляем отступы в пикселях // Вычисляем отступы в пикселях
qreal leftMargin = 20 * mmToPixels; // 20мм слева qreal leftMargin = 20 * mmToPixels; // 20мм слева
qreal topMargin = 5 * mmToPixels; // 5мм сверху qreal topMargin = 5 * mmToPixels; // 5мм сверху
@@ -1495,8 +1528,15 @@ bool PDFController::addPerechenTableRange(QPainter &painter, PerechenTableModel
return false; 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); painter.setPen(tablePen);
// Настройки шрифта для таблицы - получаем из настроек проекта // Настройки шрифта для таблицы - получаем из настроек проекта
@@ -1512,9 +1552,6 @@ bool PDFController::addPerechenTableRange(QPainter &painter, PerechenTableModel
// Заголовки колонок // Заголовки колонок
QStringList headers = {"Поз.", "Наименование", "Кол.", "Примечание"}; QStringList headers = {"Поз.", "Наименование", "Кол.", "Примечание"};
// Размеры колонок в миллиметрах (конвертируем в пиксели)
qreal mmToPixels = painter.device()->logicalDpiX() / 25.4;
qreal posWidth = 20 * mmToPixels; // Поз.: 20мм qreal posWidth = 20 * mmToPixels; // Поз.: 20мм
qreal nameWidth = 110 * mmToPixels; // Наименование: 110мм qreal nameWidth = 110 * mmToPixels; // Наименование: 110мм
qreal qtyWidth = 10 * mmToPixels; // Кол.: 10мм qreal qtyWidth = 10 * mmToPixels; // Кол.: 10мм
@@ -2080,8 +2117,15 @@ bool PDFController::addSpecificationPcbTableRange(QPainter &painter, Specificati
return false; 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); painter.setPen(tablePen);
// Настройки шрифта для таблицы - получаем из настроек проекта // Настройки шрифта для таблицы - получаем из настроек проекта
@@ -2097,9 +2141,6 @@ bool PDFController::addSpecificationPcbTableRange(QPainter &painter, Specificati
// Заголовки колонок для спецификации PCB // Заголовки колонок для спецификации PCB
QStringList headers = {"Формат", "Зона", "Поз.", "Обозначение", "Наименование", "Кол.", "Примечание"}; QStringList headers = {"Формат", "Зона", "Поз.", "Обозначение", "Наименование", "Кол.", "Примечание"};
// Размеры колонок в миллиметрах (конвертируем в пиксели)
qreal mmToPixels = painter.device()->logicalDpiX() / 25.4;
qreal formatWidth = 6 * mmToPixels; // Формат: 15мм qreal formatWidth = 6 * mmToPixels; // Формат: 15мм
qreal zoneWidth = 6 * mmToPixels; // Зона: 15мм qreal zoneWidth = 6 * mmToPixels; // Зона: 15мм
qreal posWidth = 8 * mmToPixels; // Поз.: 15мм qreal posWidth = 8 * mmToPixels; // Поз.: 15мм
@@ -2348,8 +2389,15 @@ bool PDFController::addSpecificationTableRange(QPainter &painter, SpecificationT
return false; 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); painter.setPen(tablePen);
// Настройки шрифта для таблицы - получаем из настроек проекта // Настройки шрифта для таблицы - получаем из настроек проекта
@@ -2365,9 +2413,6 @@ bool PDFController::addSpecificationTableRange(QPainter &painter, SpecificationT
// Заголовки колонок для спецификации материалов // Заголовки колонок для спецификации материалов
QStringList headers = {"Формат", "Зона", "Поз.", "Обозначение", "Наименование", "Кол.", "Примечание"}; QStringList headers = {"Формат", "Зона", "Поз.", "Обозначение", "Наименование", "Кол.", "Примечание"};
// Размеры колонок в миллиметрах (конвертируем в пиксели)
qreal mmToPixels = painter.device()->logicalDpiX() / 25.4;
qreal formatWidth = 6 * mmToPixels; // Формат: 15мм qreal formatWidth = 6 * mmToPixels; // Формат: 15мм
qreal zoneWidth = 6 * mmToPixels; // Зона: 15мм qreal zoneWidth = 6 * mmToPixels; // Зона: 15мм
qreal posWidth = 8 * mmToPixels; // Поз.: 15мм qreal posWidth = 8 * mmToPixels; // Поз.: 15мм
@@ -2616,8 +2661,15 @@ bool PDFController::addVedomostTableRange(QPainter &painter, VedomostTableModel
return false; return false;
} }
// Рисуем рамку таблицы // Размеры колонок в миллиметрах (конвертируем в пиксели) для А5 формата
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); painter.setPen(tablePen);
// Настройки шрифта для таблицы - получаем из настроек проекта // Настройки шрифта для таблицы - получаем из настроек проекта
@@ -2634,9 +2686,6 @@ bool PDFController::addVedomostTableRange(QPainter &painter, VedomostTableModel
QStringList headers = {"№ строки","Наименование", "Код продукции", "Обозначение документа на поставку", "Поставщик", QStringList headers = {"№ строки","Наименование", "Код продукции", "Обозначение документа на поставку", "Поставщик",
"Куда входит (обозначение)", "Количество на изделие", "Количество в комплекте", "Куда входит (обозначение)", "Количество на изделие", "Количество в комплекте",
"Количество на регулир", "Количество всего", "Примечание"}; "Количество на регулир", "Количество всего", "Примечание"};
// Размеры колонок в миллиметрах (конвертируем в пиксели) для А5 формата
qreal mmToPixels = painter.device()->logicalDpiX() / 25.4;
qreal nnRowWidth = 7*mmToPixels; qreal nnRowWidth = 7*mmToPixels;
qreal nameWidth = 60 * mmToPixels; // Наименование qreal nameWidth = 60 * mmToPixels; // Наименование
qreal productCodeWidth = 45 * mmToPixels; // Код продукции qreal productCodeWidth = 45 * mmToPixels; // Код продукции
+122 -18
View File
@@ -14,6 +14,7 @@ SpecificationPCBController::SpecificationPCBController(QObject *parent)
, m_designatorMappingModel(nullptr) , m_designatorMappingModel(nullptr)
, m_projectSettingsModel(nullptr) , m_projectSettingsModel(nullptr)
, m_mainController(nullptr) , m_mainController(nullptr)
, m_pcbDocFileName("")
{ {
// Устанавливаем маппинг по умолчанию для спецификации платы // Устанавливаем маппинг по умолчанию для спецификации платы
m_columnMappings << "Format" << "Zone" << "Position" << "Designator" << "Name" << "Quantity" << "Value"; m_columnMappings << "Format" << "Zone" << "Position" << "Designator" << "Name" << "Quantity" << "Value";
@@ -143,27 +144,50 @@ void SpecificationPCBController::generateTableFromComponents()
SpecificationPCBRowData defaultRow5; SpecificationPCBRowData defaultRow5;
defaultRow5.isHeader = false; defaultRow5.isHeader = false;
defaultRow5.format = SpecificationPCBCellData("A3", 0, 1, true); defaultRow5.format = SpecificationPCBCellData("*)", 0, 1, false);
defaultRow5.zone = SpecificationPCBCellData("", 0, 1, true); defaultRow5.zone = SpecificationPCBCellData("", 0, 1, false);
defaultRow5.position = SpecificationPCBCellData("", 0, 1, true); defaultRow5.position = SpecificationPCBCellData("", 0, 1, false);
defaultRow5.designation = SpecificationPCBCellData(getDecimalNumberBoard()+" Д33", 0, 1, true); defaultRow5.designation = SpecificationPCBCellData(getDecimalNumberBoard()+" Д33", 0, 1, false);
defaultRow5.name = SpecificationPCBCellData("Данные проектирования модуля", 0, 1, true); defaultRow5.name = SpecificationPCBCellData("Данные результатов проектирования", 0, 1, false);
defaultRow5.quantity = SpecificationPCBCellData("", 0, 1, true); defaultRow5.quantity = SpecificationPCBCellData("", 0, 1, false);
defaultRow5.note = SpecificationPCBCellData("", 0, 1, true); defaultRow5.note = SpecificationPCBCellData("DVD диск", 0, 1, false);
m_tableModel->addRow(defaultRow5); m_tableModel->addRow(defaultRow5);
m_tableModel->addRow(emptyRow); m_tableModel->addRow(emptyRow);
SpecificationPCBRowData headerRow2; SpecificationPCBRowData defaultRow5_1;
headerRow2.isHeader = true; defaultRow5_1.isHeader = false;
headerRow2.format = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); defaultRow5_1.format = SpecificationPCBCellData("А4", 0, 1, false);
headerRow2.zone = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); defaultRow5_1.zone = SpecificationPCBCellData("", 0, 1, false);
headerRow2.position = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); defaultRow5_1.position = SpecificationPCBCellData("", 0, 1, false);
headerRow2.designation = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); defaultRow5_1.designation = SpecificationPCBCellData(getDecimalNumberBoard()+" Д10-УЛ", 0, 1, false);
headerRow2.name = SpecificationPCBCellData("Сборочные единицы", 0, 1, true, false, false, 100, true); defaultRow5_1.name = SpecificationPCBCellData("Удостоверяющий лист", 0, 1, false);
headerRow2.quantity = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); defaultRow5_1.quantity = SpecificationPCBCellData("", 0, 1, false);
headerRow2.note = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true); defaultRow5_1.note = SpecificationPCBCellData("Размножать", 0, 1, false);
m_tableModel->addRow(headerRow2); 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); m_tableModel->addRow(emptyRow);
@@ -180,6 +204,28 @@ void SpecificationPCBController::generateTableFromComponents()
m_tableModel->addRow(emptyRow); 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; SpecificationPCBRowData headerRow3;
headerRow3.isHeader = true; headerRow3.isHeader = true;
headerRow3.format = SpecificationPCBCellData("", 0, 1, true, false, false, 100, 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.designation = SpecificationPCBCellData("", 0, 1, true, false, false, 100, true);
headerRow3.name = 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); m_tableModel->addRow(headerRow3);
@@ -493,6 +539,53 @@ void SpecificationPCBController::generateTableFromComponents()
} catch (...) { } catch (...) {
qDebug() << "SpecificationPCBController::generateTableFromComponents: Неизвестная ошибка при генерации"; 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() void SpecificationPCBController::updateTableFromComponents()
@@ -799,6 +892,17 @@ void SpecificationPCBController::setBoardName(const QString &value)
setColumnMappings(mappings); 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) void SpecificationPCBController::setColumnMappings(const QStringList &mappings)
{ {
qDebug() << "SpecificationPCBController::setColumnMappings: Устанавливаем новые настройки колонок:" << mappings; qDebug() << "SpecificationPCBController::setColumnMappings: Устанавливаем новые настройки колонок:" << mappings;
+5
View File
@@ -71,6 +71,10 @@ public:
// Методы для работы с названием платы // Методы для работы с названием платы
QString getBoardName() const; QString getBoardName() const;
void setBoardName(const QString &value); void setBoardName(const QString &value);
// Методы для работы с именем PcbDoc файла
void setPcbDocFileName(const QString &fileName);
QString getPcbDocFileName() const;
private: private:
QString getComponentValue(ComponentModel *component, const QString &propertyName); QString getComponentValue(ComponentModel *component, const QString &propertyName);
@@ -107,6 +111,7 @@ private:
QList<ComponentModel*> m_components; QList<ComponentModel*> m_components;
QStringList m_columnMappings; QStringList m_columnMappings;
QStringList m_propertyNames; QStringList m_propertyNames;
QString m_pcbDocFileName; // Имя PcbDoc файла
}; };
#endif // SPECIFICATIONPCBCONTROLLER_H #endif // SPECIFICATIONPCBCONTROLLER_H