123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- #include "GreyClusteringItemDelegate.h"
- #include "GreyClusteringSampleTable.h"
- #include "MultiLevelHeaderView.h"
- #include "CMind.h"
- #include "dbService/GradeInfoService.h"
- #include "dbService/EffectIndexInfoService.h"
- #include "algorithm/GreyClusterEvaluation.h"
- #include <QHeaderView>
- #include <QDebug>
- #include <QMessageBox>
- #include <QtMath>
- GreyClusteringSampleTable::GreyClusteringSampleTable(CMind *mind, int grayNumber, QWidget *parent)
- : QTableView(parent), m_mind(mind), m_nodeDepth(2), m_grayNumber(grayNumber)
- {
- m_model = new QStandardItemModel();
- this->setModel(m_model);
- init();
- initClusteringItems();
- refreshTableView();
- }
- void GreyClusteringSampleTable::refreshTableView()
- {
- m_model->clear();
- if (m_greyClusterings.size() == 0) {
- return;
- }
- QStringList greyNames;
- for (auto &item : m_greyClusterings) {
- if (!item.value.isNull()) {
- for (const auto &s : item.value->greyRanges) {
- greyNames << s.name;
- }
- break;
- }
- }
- int colCount = m_nodeDepth + 6 + greyNames.size();
-
- {
- auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, colCount, this);
- hHeader->setSectionResizeMode(QHeaderView::Stretch);
- hHeader->setCellSpan(0, 0, 2, m_nodeDepth);
- for (int n = 0; n < 2 + greyNames.size(); ++n) {
- hHeader->setCellSpan(0, m_nodeDepth + n, 2, 1);
- }
- hHeader->setCellSpan(0, m_nodeDepth + 2 + greyNames.size(), 1, 2);
- hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size(), 1, 1);
- hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size() + 1, 1, 1);
- hHeader->setCellSpan(0, m_nodeDepth + 4 + greyNames.size(), 1, 2);
- hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size(), 1, 1);
- hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size() + 1, 1, 1);
-
- hHeader->setCellText(0, 0, QString("指标"));
- hHeader->setCellText(0, m_nodeDepth, QString("单位"));
- hHeader->setCellText(0, m_nodeDepth + 1, QString("权重"));
- for (int i = 0; i < greyNames.size(); ++i) {
- hHeader->setCellText(0, m_nodeDepth + 2 + i, greyNames.at(i));
- }
- hHeader->setCellText(0, m_nodeDepth + 2 + greyNames.size(), QString("延拓值"));
- hHeader->setCellText(0, m_nodeDepth + 4 + greyNames.size(), QString("实现值"));
-
- hHeader->setCellText(1, m_nodeDepth + 2 + greyNames.size(), "左");
- hHeader->setCellText(1, m_nodeDepth + 3 + greyNames.size(), "右");
- hHeader->setCellText(1, m_nodeDepth + 4 + greyNames.size(), "建设前");
- hHeader->setCellText(1, m_nodeDepth + 5 + greyNames.size(), "建设后");
- this->setHorizontalHeader(hHeader);
- }
- m_model->setColumnCount(colCount);
- m_model->setRowCount(m_rowCount);
- for (const auto &item : m_greyClusterings) {
-
- auto s = new QStandardItem(item.indexName);
- s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
- s->setTextAlignment(Qt::AlignCenter);
- s->setToolTip(item.indexName);
- m_model->setItem(item.row, item.col, s);
- if (item.rowSpan > 1 || item.colSpan > 1) {
- this->setSpan(item.row, item.col, item.rowSpan, item.colSpan);
- }
-
- if (!item.value.isNull()) {
- int offset = item.colSpan;
- m_model->setItem(item.row, item.col + offset, new QStandardItem(item.value->units));
- ++offset;
- m_model->setItem(item.row, item.col + offset,
- new QStandardItem(QString::number(item.value->weiget)));
- ++offset;
- for (auto &range : item.value->greyRanges) {
- QString r;
- r += range.leftClose ? "[" : "(";
- r += QString("%1, %2").arg(range.leftValue).arg(range.rightValue);
- r += range.rightClose ? "]" : ")";
- m_model->setItem(item.row, item.col + offset, new QStandardItem(r));
- ++offset;
- }
- m_model->setItem(item.row, item.col + offset,
- new QStandardItem(QString::number(item.value->leftExtension)));
- ++offset;
- m_model->setItem(item.row, item.col + offset,
- new QStandardItem(QString::number(item.value->rightExtension)));
- ++offset;
- m_model->setItem(item.row, item.col + offset,
- new QStandardItem(QString::number(item.value->oldValue)));
- ++offset;
- m_model->setItem(item.row, item.col + offset,
- new QStandardItem(QString::number(item.value->newValue)));
- ++offset;
- for (int c = item.colSpan; c < offset - 2; ++c) {
- m_model->item(item.row, item.col + c)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
- m_model->item(item.row, item.col + c)->setTextAlignment(Qt::AlignCenter);
- }
- for (int c = offset - 2; c < offset; ++c) {
- m_model->item(item.row, item.col + c)->setTextAlignment(Qt::AlignCenter);
- this->setItemDelegateForColumn(item.col + c, new GreyClusteringItemSpinDelegate(this));
- }
- }
- }
- }
- void GreyClusteringSampleTable::compute()
- {
- GCEMat mat;
- GCERangeMat ranges;
- QVector<GCEmat> samples;
- int colCount = m_nodeDepth + 4 + m_grayNumber;
- for (int r = 0; r < m_rowCount; ++r) {
- samples << GCEmat { m_model->item(r, colCount)->text().toDouble(),
- m_model->item(r, colCount + 1)->text().toDouble() };
- }
- mat = samples;
-
- for (const auto &item : m_greyClusterings) {
- if (!item.value.isNull()) {
- QVector<GCERange> rg;
- QSet<double> fullSet;
- fullSet << item.value->leftExtension;
- for (const auto &grange : item.value->greyRanges) {
- fullSet << grange.leftValue << grange.rightValue;
- }
- fullSet << item.value->rightExtension;
- QList<double> full = fullSet.toList();
- std::sort(full.begin(), full.end());
- for (int i = 0; i < item.value->greyRanges.size(); ++i) {
- double left;
- double right;
- int lloc = full.indexOf(item.value->greyRanges.at(i).leftValue);
- int rloc = full.indexOf(item.value->greyRanges.at(i).rightValue);
- if (lloc == 0) {
- left = full[0];
- } else {
- left = full[lloc - 1];
- }
- if (rloc == full.size() - 1) {
- right = full.last();
- } else {
- right = full[rloc + 1];
- }
- rg << GCERange { i, left, item.value->greyRanges.at(i).leftValue,
- item.value->greyRanges.at(i).rightValue, right };
- }
- ranges << rg;
- }
- }
- QScopedPointer<GreyClusterEvaluation> gc(new GreyClusterEvaluation(mat, ranges));
- gc->evaluate({ 0.2, 0.15, 0.05, 0.4, 0.2 });
- BestIndex index = gc->getBestIndex();
- qDebug() << index.front_index << index.back_index;
- }
- void GreyClusteringSampleTable::init()
- {
- setAlternatingRowColors(false);
- horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
- horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
- verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
- verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
- setSelectionMode(QAbstractItemView::SingleSelection);
- QList<GradeInfo *> gradeInfoList;
- QMap<QString, QString> grayLevelMaps;
- int projectId = m_mind->root().projectId;
- if (!GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, projectId, 1)) {
- QMessageBox::warning(this, "警告", "数据库访问失败");
- } else {
- if (gradeInfoList.size() == 0) {
- for (int lvl = 0; lvl < m_grayNumber; ++lvl) {
- grayLevelMaps.insert(QString("级别 %1:").arg(lvl + 1), QString("E%1").arg(lvl + 1));
- GradeInfo ginfo;
- ginfo.projectId = projectId;
- ginfo.gradeName = QString("级别 %1").arg(lvl + 1);
- ginfo.gradeValue = QString("灰类%1级").arg(lvl + 1);
- ginfo.type = 1;
- if (!GradeInfoService().AddGradeInfo(ginfo)) {
- QMessageBox::warning(this, "警告", "数据库访问失败");
- }
- }
- } else {
- for (const auto &gi : gradeInfoList) {
- grayLevelMaps.insert(gi->gradeName, gi->gradeValue);
- if (grayLevelMaps.size() >= m_grayNumber) {
- break;
- }
- }
-
- for (int lvl = grayLevelMaps.size(); lvl < m_grayNumber; ++lvl) {
- grayLevelMaps.insert(QString("级别 %1:").arg(lvl + 1), QString("E%1").arg(lvl + 1));
- GradeInfo ginfo;
- ginfo.projectId = projectId;
- ginfo.gradeName = QString("级别 %1").arg(lvl + 1);
- ginfo.gradeValue = QString("灰类%1级").arg(lvl + 1);
- ginfo.type = 1;
- if (!GradeInfoService().AddGradeInfo(ginfo)) {
- QMessageBox::warning(this, "警告", "数据库访问失败");
- }
- }
- m_grayNames = grayLevelMaps.values();
- }
- }
- qDeleteAll(gradeInfoList);
- }
- void GreyClusteringSampleTable::initClusteringItems()
- {
-
- if (m_mind->levels() < 2) {
- return;
- }
- m_greyClusterings.clear();
-
- int row = 0;
- for (CNodeData n : m_mind->nodesInLevel(m_mind->levels() - 1)) {
- GreyClusteringItem parentItem = { n.name, row, 0, 1, 1, nullptr };
- QList<CNodeData> subNodes = m_mind->subNodes(n);
- parentItem.colSpan = subNodes.size() == 0 ? 2 : 1;
- parentItem.rowSpan = subNodes.size() == 0 ? 1 : subNodes.size();
- if (subNodes.size() == 0) {
- GreyClusteringValue *sg = new GreyClusteringValue;
- sg->units = "";
- sg->weiget = 0;
- for (const auto &gname : m_grayNames) {
- sg->greyRanges << GreyRange { gname, true, 0, true, 0 };
- }
- sg->leftExtension = 0;
- sg->rightExtension = 0;
- sg->oldValue = 0;
- sg->newValue = 0;
- parentItem.value.reset(sg);
- }
- m_greyClusterings.append(parentItem);
- int subRow = row;
-
- for (const CNodeData &sub : subNodes) {
-
- GreyClusteringItem childItem = { sub.name, subRow, 1, 1, 1, nullptr };
- GreyClusteringValue *sg = new GreyClusteringValue;
- sg->units = "";
- sg->weiget = 0;
- for (const auto &gname : m_grayNames) {
- sg->greyRanges << GreyRange { gname, true, 0, true, 0 };
- }
- sg->leftExtension = 0;
- sg->rightExtension = 0;
- sg->oldValue = 0;
- sg->newValue = 0;
- childItem.value.reset(sg);
- m_greyClusterings.append(childItem);
- subRow++;
- }
- row += parentItem.rowSpan;
- }
- m_rowCount = row;
-
- QList<EffectIndexInfo *> effectIndexInfoList;
- int projectid = m_mind->root().projectId;
- if (!EffectIndexInfoService().QueryEffectIndexInfoByProjectId(&effectIndexInfoList, projectid)) {
- QMessageBox::warning(this, "警告", "数据库访问失败");
- return;
- }
- if (effectIndexInfoList.size() > 0) {
- for (auto &item : m_greyClusterings) {
- if (item.value.isNull()) {
- continue;
- }
- for (const auto &effInfo : effectIndexInfoList) {
- if (effInfo->effectIndexName == item.indexName) {
- item.value->units = effInfo->effectIndexUnit;
- item.value->leftExtension = effInfo->extendLeft.toDouble();
- item.value->rightExtension = effInfo->extendRight.toDouble();
-
- QStringList valueList = effInfo->effectIndexValue.split(",");
- int align = qMin(valueList.size(), item.value->greyRanges.size());
- for (int str = 0; str < align; str++) {
-
- QStringList lr = valueList.at(str).mid(1, valueList.at(str).size() - 2).split(":");
- item.value->greyRanges[str].leftValue = lr.at(0).toDouble();
- item.value->greyRanges[str].rightValue = lr.at(1).toDouble();
- }
- }
- }
- }
- }
- qDeleteAll(effectIndexInfoList);
- if (projectid == 113) {
- QVector<double> left = { 2, 35, 2, 90, 2.5, 35, 70, 2.5, 35, 30, 2.5, 70, 25, 2, 50, 1, 45, 8, 60, 1 };
- QVector<double> right = { 4, 20, 3, 40, 0.5, 55, 90, 1.2, 55, 70, 1.2, 90, 60, 6, 20, 3, 75, 25, 25, 3 };
- int sn = 0;
- for (auto &item : m_greyClusterings) {
- if (item.value.isNull()) {
- continue;
- }
- if (sn < left.size()) {
- item.value->oldValue = left.at(sn);
- item.value->newValue = right.at(sn);
- }
- sn++;
- }
- }
- }
|