218 lines
5.7 KiB
C++
218 lines
5.7 KiB
C++
#include "pcbmaterialmodel.h"
|
|
#include <QDebug>
|
|
|
|
PCBMaterialModel::PCBMaterialModel(QObject *parent)
|
|
: QAbstractTableModel(parent)
|
|
, m_database(nullptr)
|
|
, m_layerCount(0)
|
|
{
|
|
qDebug() << "PCBMaterialModel: Модель материалов платы создана";
|
|
}
|
|
|
|
int PCBMaterialModel::rowCount(const QModelIndex &parent) const
|
|
{
|
|
Q_UNUSED(parent)
|
|
return m_materials.size();
|
|
}
|
|
|
|
int PCBMaterialModel::columnCount(const QModelIndex &parent) const
|
|
{
|
|
Q_UNUSED(parent)
|
|
return ColumnCount;
|
|
}
|
|
|
|
QVariant PCBMaterialModel::data(const QModelIndex &index, int role) const
|
|
{
|
|
if (!index.isValid() || index.row() >= m_materials.size()) {
|
|
return QVariant();
|
|
}
|
|
|
|
const PCBMaterialData &material = m_materials[index.row()];
|
|
|
|
if (role == Qt::DisplayRole) {
|
|
switch (index.column()) {
|
|
case ColumnLayerNumber:
|
|
return material.layerNumber;
|
|
case ColumnName:
|
|
return material.name;
|
|
case ColumnValue:
|
|
return material.value;
|
|
case ColumnHeight:
|
|
return formatHeight(material.height);
|
|
case ColumnDielType:
|
|
return formatDielType(material.dielType);
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
|
|
if (role == Qt::TextAlignmentRole) {
|
|
switch (index.column()) {
|
|
case ColumnLayerNumber:
|
|
case ColumnHeight:
|
|
case ColumnDielType:
|
|
return Qt::AlignCenter;
|
|
default:
|
|
return Qt::AlignLeft;
|
|
}
|
|
}
|
|
|
|
return QVariant();
|
|
}
|
|
|
|
QVariant PCBMaterialModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
{
|
|
if (role != Qt::DisplayRole) {
|
|
return QVariant();
|
|
}
|
|
|
|
if (orientation == Qt::Horizontal) {
|
|
switch (section) {
|
|
case ColumnLayerNumber:
|
|
return tr("№ Слоя");
|
|
case ColumnName:
|
|
return tr("Название");
|
|
case ColumnValue:
|
|
return tr("Значение");
|
|
case ColumnHeight:
|
|
return tr("Толщина (мм)");
|
|
case ColumnDielType:
|
|
return tr("Тип");
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
|
|
return QVariant();
|
|
}
|
|
|
|
void PCBMaterialModel::setDatabase(DataBaseController *database)
|
|
{
|
|
m_database = database;
|
|
qDebug() << "PCBMaterialModel: База данных установлена:" << (m_database ? "да" : "нет");
|
|
}
|
|
|
|
void PCBMaterialModel::loadMaterials()
|
|
{
|
|
if (!m_database) {
|
|
qDebug() << "PCBMaterialModel: ОШИБКА: База данных не установлена!";
|
|
return;
|
|
}
|
|
|
|
qDebug() << "PCBMaterialModel: Загружаем материалы платы из БД...";
|
|
|
|
beginResetModel();
|
|
|
|
// Очищаем текущие данные
|
|
m_materials.clear();
|
|
m_layerCount = 0;
|
|
|
|
// Получаем данные PCB
|
|
PCBData pcbData = m_database->getPCBData();
|
|
m_layerCount = pcbData.layerCount;
|
|
|
|
qDebug() << "PCBMaterialModel: Количество слоев из БД:" << m_layerCount;
|
|
|
|
// Получаем материалы
|
|
QList<DielProperty> dielMaterials = m_database->getDielMaterials();
|
|
|
|
qDebug() << "PCBMaterialModel: Количество материалов из БД:" << dielMaterials.size();
|
|
|
|
// Конвертируем DielProperty в PCBMaterialData
|
|
for (const DielProperty &diel : dielMaterials) {
|
|
PCBMaterialData material(
|
|
-1, // ID будет установлен позже, если нужно
|
|
diel.name,
|
|
diel.value,
|
|
diel.height,
|
|
diel.dielType,
|
|
diel.layerNumber
|
|
);
|
|
|
|
m_materials.append(material);
|
|
|
|
qDebug() << "PCBMaterialModel: Добавлен материал:" << material.name
|
|
<< "=" << material.value << "слой:" << material.layerNumber
|
|
<< "толщина:" << material.height << "мм";
|
|
}
|
|
|
|
endResetModel();
|
|
|
|
qDebug() << "PCBMaterialModel: Загрузка завершена. Материалов:" << m_materials.size()
|
|
<< "слоев:" << m_layerCount;
|
|
}
|
|
|
|
void PCBMaterialModel::clearMaterials()
|
|
{
|
|
qDebug() << "PCBMaterialModel: Очищаем материалы";
|
|
|
|
beginResetModel();
|
|
m_materials.clear();
|
|
m_layerCount = 0;
|
|
endResetModel();
|
|
}
|
|
|
|
PCBMaterialData PCBMaterialModel::getMaterial(int row) const
|
|
{
|
|
if (row >= 0 && row < m_materials.size()) {
|
|
return m_materials[row];
|
|
}
|
|
return PCBMaterialData();
|
|
}
|
|
|
|
QString PCBMaterialModel::getMaterialName(int row) const
|
|
{
|
|
if (row >= 0 && row < m_materials.size()) {
|
|
return m_materials[row].name;
|
|
}
|
|
return QString();
|
|
}
|
|
|
|
QString PCBMaterialModel::getMaterialValue(int row) const
|
|
{
|
|
if (row >= 0 && row < m_materials.size()) {
|
|
return m_materials[row].value;
|
|
}
|
|
return QString();
|
|
}
|
|
|
|
double PCBMaterialModel::getMaterialHeight(int row) const
|
|
{
|
|
if (row >= 0 && row < m_materials.size()) {
|
|
return m_materials[row].height;
|
|
}
|
|
return 0.0;
|
|
}
|
|
|
|
int PCBMaterialModel::getMaterialDielType(int row) const
|
|
{
|
|
if (row >= 0 && row < m_materials.size()) {
|
|
return m_materials[row].dielType;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int PCBMaterialModel::getMaterialLayerNumber(int row) const
|
|
{
|
|
if (row >= 0 && row < m_materials.size()) {
|
|
return m_materials[row].layerNumber;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
QString PCBMaterialModel::formatHeight(double height) const
|
|
{
|
|
return QString::number(height, 'f', 3);
|
|
}
|
|
|
|
QString PCBMaterialModel::formatDielType(int dielType) const
|
|
{
|
|
switch (dielType) {
|
|
case 1:
|
|
return tr("Ядро");
|
|
case 2:
|
|
return tr("Препрег");
|
|
default:
|
|
return tr("Неизвестно");
|
|
}
|
|
}
|