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:
@@ -136,3 +136,4 @@ ENV/
|
|||||||
*.pdfprj.bak
|
*.pdfprj.bak
|
||||||
*.backup
|
*.backup
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,3 +2,4 @@ IDI_ICON1 ICON DISCARDABLE "assets/icon2.ico"
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
// Инициализация регулярных выражений для парсинга
|
// Инициализация регулярных выражений для парсинга
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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; // Код продукции
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user