GreyClusteringSampleTable.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. #include "GreyClusteringItemDelegate.h"
  2. #include "GreyClusteringSampleTable.h"
  3. #include "MultiLevelHeaderView.h"
  4. #include "CMind.h"
  5. #include "dbService/GradeInfoService.h"
  6. #include "dbService/EffectIndexInfoService.h"
  7. #include "dbService/SchemeInfoService.h"
  8. #include "algorithm/GreyClusterEvaluation.h"
  9. #include "ProjectManager.h"
  10. #include <QHeaderView>
  11. #include <QDebug>
  12. #include <QMessageBox>
  13. #include <QtMath>
  14. /**
  15. * example
  16. * QVector<GreyClusteringItem> gcItems;
  17. gcItems << GreyClusteringItem { "火力", 0, 0, 9, 1, nullptr };
  18. QSharedPointer<GreyClusteringValue> sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  19. sg->units = "m";
  20. sg->weiget = 2;
  21. sg->greyRanges << GreyRange { "较差类", true, 85, true, 100 };
  22. sg->greyRanges << GreyRange { "一般类", true, 100, true, 115 };
  23. sg->greyRanges << GreyRange { "较好类", true, 115, true, 125 };
  24. sg->leftExtension = 70;
  25. sg->rightExtension = 140;
  26. sg->oldValue = 0;
  27. sg->newValue = 0;
  28. gcItems << GreyClusteringItem { "火炮口径", 0, 1, 1, 2, sg };
  29. gcItems << GreyClusteringItem { "初速", 1, 1, 3, 1, nullptr };
  30. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  31. sg->units = "m";
  32. sg->weiget = 4;
  33. sg->greyRanges << GreyRange { "较差类", true, 1600, true, 1300 };
  34. sg->greyRanges << GreyRange { "一般类", true, 1600, true, 1900 };
  35. sg->greyRanges << GreyRange { "较好类", true, 1600, true, 1900 };
  36. sg->leftExtension = 500;
  37. sg->rightExtension = 220;
  38. sg->oldValue = 0;
  39. sg->newValue = 0;
  40. gcItems << GreyClusteringItem { "穿甲弹", 1, 2, 1, 1, sg };
  41. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  42. sg->units = "m";
  43. sg->weiget = 4;
  44. sg->greyRanges << GreyRange { "较差类", true, 1000, true, 1200 };
  45. sg->greyRanges << GreyRange { "一般类", true, 1200, true, 1400 };
  46. sg->greyRanges << GreyRange { "较好类", true, 1200, true, 1400 };
  47. sg->leftExtension = 600;
  48. sg->rightExtension = 1700;
  49. sg->oldValue = 0;
  50. sg->newValue = 0;
  51. gcItems << GreyClusteringItem { "破甲弹", 2, 2, 1, 1, sg };
  52. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  53. sg->units = "m";
  54. sg->weiget = 4;
  55. sg->greyRanges << GreyRange { "较差类", true, 500, false, 650 };
  56. sg->greyRanges << GreyRange { "一般类", true, 650, false, 800 };
  57. sg->greyRanges << GreyRange { "较好类", true, 800, false, 1000 };
  58. sg->leftExtension = 400;
  59. sg->rightExtension = 1100;
  60. sg->oldValue = 0;
  61. sg->newValue = 0;
  62. gcItems << GreyClusteringItem { "榴弹", 3, 2, 1, 1, sg };
  63. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  64. sg->units = "";
  65. sg->weiget = 5;
  66. sg->greyRanges << GreyRange { "较差类", true, 0.5, false, 0.65 };
  67. sg->greyRanges << GreyRange { "一般类", true, 0.65, false, 0.75 };
  68. sg->greyRanges << GreyRange { "较好类", true, 0.75, false, 0.9 };
  69. sg->leftExtension = 0.45;
  70. sg->rightExtension = 0.95;
  71. sg->oldValue = 0;
  72. sg->newValue = 0;
  73. gcItems << GreyClusteringItem { "首发命中", 4, 1, 1, 2, sg };
  74. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  75. sg->units = "m";
  76. sg->weiget = 5;
  77. sg->greyRanges << GreyRange { "较差类", true, 800, false, 1200 };
  78. sg->greyRanges << GreyRange { "一般类", true, 1200, false, 1600 };
  79. sg->greyRanges << GreyRange { "较好类", true, 1600, false, 2200 };
  80. sg->leftExtension = 500;
  81. sg->rightExtension = 2500;
  82. sg->oldValue = 0;
  83. sg->newValue = 0;
  84. gcItems << GreyClusteringItem { "直射距离", 5, 1, 1, 2, sg };
  85. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  86. sg->units = "发";
  87. sg->weiget = 3;
  88. sg->greyRanges << GreyRange { "较差类", true, 30, false, 40 };
  89. sg->greyRanges << GreyRange { "一般类", true, 40, false, 50 };
  90. sg->greyRanges << GreyRange { "较好类", true, 50, false, 65 };
  91. sg->leftExtension = 28;
  92. sg->rightExtension = 70;
  93. sg->oldValue = 0;
  94. sg->newValue = 0;
  95. gcItems << GreyClusteringItem { "弹药基数", 6, 1, 1, 2, sg };
  96. gcItems << GreyClusteringItem { "时间", 7, 1, 2, 1, nullptr };
  97. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  98. sg->units = "s";
  99. sg->weiget = 3;
  100. sg->greyRanges << GreyRange { "较差类", true, 11, false, 10 };
  101. sg->greyRanges << GreyRange { "一般类", true, 10, false, 7 };
  102. sg->greyRanges << GreyRange { "较好类", true, 7, false, 4 };
  103. sg->leftExtension = 12;
  104. sg->rightExtension = 3;
  105. sg->oldValue = 0;
  106. sg->newValue = 0;
  107. gcItems << GreyClusteringItem { "静对静", 7, 2, 1, 1, sg };
  108. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  109. sg->units = "s";
  110. sg->weiget = 3;
  111. sg->greyRanges << GreyRange { "较差类", true, 14, false, 12 };
  112. sg->greyRanges << GreyRange { "一般类", true, 12, false, 10 };
  113. sg->greyRanges << GreyRange { "较好类", true, 10, false, 7 };
  114. sg->leftExtension = 15;
  115. sg->rightExtension = 5;
  116. sg->oldValue = 0;
  117. sg->newValue = 0;
  118. gcItems << GreyClusteringItem { "静对动", 8, 2, 1, 1, sg };
  119. GreyClusteringSampleTable gcst(gcItems, 3, 9);
  120. gcst.resize(1200, 800);
  121. gcst.refreshTableView();
  122. gcst.show();
  123. */
  124. GreyClusteringSampleTable::GreyClusteringSampleTable(CMind *mind, int grayNumber, QWidget *parent)
  125. : QTableView(parent), m_mind(mind), m_nodeDepth(2), m_grayNumber(grayNumber)
  126. {
  127. m_model = new QStandardItemModel();
  128. connect(m_model, &QStandardItemModel::itemChanged, this, &GreyClusteringSampleTable::itemChanged);
  129. this->setModel(m_model);
  130. init();
  131. refreshData();
  132. }
  133. void GreyClusteringSampleTable::refreshData()
  134. {
  135. loadData();
  136. loadSchemeData();
  137. initClusteringItems();
  138. refreshTableView();
  139. }
  140. void GreyClusteringSampleTable::refreshTableView()
  141. {
  142. m_isFillingData = true;
  143. m_model->clear();
  144. if (m_greyClusterings.size() == 0) {
  145. m_isFillingData = false;
  146. return;
  147. }
  148. QStringList greyNames; // 灰数
  149. for (auto &item : m_greyClusterings) {
  150. if (!item.value.isNull()) {
  151. for (const auto &s : item.value->greyRanges) {
  152. greyNames << s.name;
  153. }
  154. break;
  155. }
  156. }
  157. int colCount = m_nodeDepth + 6 + greyNames.size();
  158. // 设置表头
  159. {
  160. if (m_tableHeaderInitialized == false) {
  161. m_tableHeaderInitialized = true;
  162. auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, colCount, this);
  163. hHeader->setSectionResizeMode(QHeaderView::Stretch);
  164. hHeader->setCellSpan(0, 0, 2, m_nodeDepth); // 指标占位
  165. for (int n = 0; n < 2 + greyNames.size(); ++n) { // 单位+权重+灰度级占位
  166. hHeader->setCellSpan(0, m_nodeDepth + n, 2, 1);
  167. }
  168. hHeader->setCellSpan(0, m_nodeDepth + 2 + greyNames.size(), 1, 2); // 延拓值占位
  169. hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size(), 1, 1);
  170. hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size() + 1, 1, 1);
  171. hHeader->setCellSpan(0, m_nodeDepth + 4 + greyNames.size(), 1, 2); // 实现值占位
  172. hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size(), 1, 1);
  173. hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size() + 1, 1, 1);
  174. // 一级
  175. hHeader->setCellText(0, 0, QString("指标"));
  176. hHeader->setCellText(0, m_nodeDepth, QString("单位"));
  177. hHeader->setCellText(0, m_nodeDepth + 1, QString("权重"));
  178. for (int i = 0; i < greyNames.size(); ++i) {
  179. hHeader->setCellText(0, m_nodeDepth + 2 + i, greyNames.at(i));
  180. }
  181. hHeader->setCellText(0, m_nodeDepth + 2 + greyNames.size(), QString("延拓值"));
  182. hHeader->setCellText(0, m_nodeDepth + 4 + greyNames.size(), QString("实现值"));
  183. // 二级
  184. hHeader->setCellText(1, m_nodeDepth + 2 + greyNames.size(), "左");
  185. hHeader->setCellText(1, m_nodeDepth + 3 + greyNames.size(), "右");
  186. hHeader->setCellText(1, m_nodeDepth + 4 + greyNames.size(), "建设前");
  187. hHeader->setCellText(1, m_nodeDepth + 5 + greyNames.size(), "建设后");
  188. this->setHorizontalHeader(hHeader);
  189. }
  190. }
  191. m_model->setColumnCount(colCount);
  192. m_model->setRowCount(m_rowCount);
  193. for (const auto &item : m_greyClusterings) {
  194. // 第一步,设置指标名
  195. auto s = new QStandardItem(item.indexName);
  196. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  197. s->setTextAlignment(Qt::AlignCenter);
  198. s->setToolTip(item.indexName);
  199. m_model->setItem(item.row, item.col, s);
  200. if (item.rowSpan > 1 || item.colSpan > 1) {
  201. this->setSpan(item.row, item.col, item.rowSpan, item.colSpan);
  202. }
  203. // 第二步,查看当前指标下是否附带值
  204. if (!item.value.isNull()) {
  205. int offset = item.colSpan;
  206. m_model->setItem(item.row, item.col + offset, new QStandardItem(item.value->units)); // 单位
  207. ++offset;
  208. m_model->setItem(item.row, item.col + offset,
  209. new QStandardItem(QString::number(item.value->weiget))); // 权重
  210. ++offset;
  211. for (auto &range : item.value->greyRanges) { // 灰度级
  212. QString r;
  213. r += range.leftClose ? "[" : "(";
  214. r += QString("%1, %2").arg(range.leftValue).arg(range.rightValue);
  215. r += range.rightClose ? "]" : ")";
  216. m_model->setItem(item.row, item.col + offset, new QStandardItem(r));
  217. ++offset;
  218. }
  219. m_model->setItem(item.row, item.col + offset,
  220. new QStandardItem(QString::number(item.value->leftExtension))); // 延拓值左
  221. ++offset;
  222. m_model->setItem(item.row, item.col + offset,
  223. new QStandardItem(QString::number(item.value->rightExtension))); // 延拓值右
  224. ++offset;
  225. QStandardItem *oldValue = new QStandardItem;
  226. if (m_schemeData.keys().contains("建设前")) {
  227. oldValue->setText(m_schemeData["建设前"][item.indexName]);
  228. }
  229. m_model->setItem(item.row, item.col + offset, oldValue); // 实现值前
  230. ++offset;
  231. QStandardItem *newValue = new QStandardItem;
  232. if (m_schemeData.keys().contains("建设后")) {
  233. newValue->setText(m_schemeData["建设后"][item.indexName]);
  234. }
  235. m_model->setItem(item.row, item.col + offset, newValue); // 实现值后
  236. ++offset;
  237. for (int c = item.colSpan; c < offset - 2; ++c) {
  238. m_model->item(item.row, item.col + c)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  239. m_model->item(item.row, item.col + c)->setTextAlignment(Qt::AlignCenter);
  240. }
  241. for (int c = offset - 2; c < offset; ++c) {
  242. m_model->item(item.row, item.col + c)->setTextAlignment(Qt::AlignCenter);
  243. this->setItemDelegateForColumn(item.col + c, new GreyClusteringItemSpinDelegate(this));
  244. }
  245. }
  246. }
  247. m_isFillingData = false;
  248. }
  249. void GreyClusteringSampleTable::itemChanged(QStandardItem *item)
  250. {
  251. if (m_isFillingData) {
  252. return;
  253. }
  254. if (horizontalHeader()->model()->rowCount() < 2 || horizontalHeader()->model()->columnCount() <= item->column()) {
  255. return;
  256. }
  257. QModelIndex hIndex = horizontalHeader()->model()->index(1, item->column());
  258. QString hTitle = horizontalHeader()->model()->data(hIndex).toString();
  259. QStringList valueStrList;
  260. for (int r = 0; r < m_model->rowCount(); ++r) {
  261. QString vTitle = m_model->item(r, 1)->text();
  262. QString value = m_model->item(r, item->column())->text();
  263. QString valueStr = vTitle + ":" + value;
  264. valueStrList.append(valueStr);
  265. }
  266. QString v = valueStrList.join(";");
  267. SchemaEval scheme;
  268. scheme.engineerId = m_mind->root().projectId;
  269. scheme.name = hTitle;
  270. scheme.valueStr = v;
  271. scheme.type = 2;
  272. bool ret = SchemeInfoService().addUniqueGCEData(scheme);
  273. qDebug() << __FUNCTION__ << __LINE__ << ret << endl;
  274. }
  275. void GreyClusteringSampleTable::compute()
  276. {
  277. GCEMat mat;
  278. GCERangeMat ranges;
  279. QVector<GCEmat> samples;
  280. int colCount = m_nodeDepth + 4 + m_grayNumber;
  281. for (int r = 0; r < m_rowCount; ++r) {
  282. samples << GCEmat { m_model->item(r, colCount)->text().toDouble(),
  283. m_model->item(r, colCount + 1)->text().toDouble() };
  284. }
  285. mat = samples;
  286. // 指标
  287. for (const auto &item : m_greyClusterings) {
  288. if (!item.value.isNull()) {
  289. QVector<GCERange> rg;
  290. QSet<double> fullSet;
  291. fullSet << item.value->leftExtension;
  292. for (const auto &grange : item.value->greyRanges) {
  293. fullSet << grange.leftValue << grange.rightValue;
  294. }
  295. fullSet << item.value->rightExtension;
  296. QList<double> full = fullSet.toList();
  297. std::sort(full.begin(), full.end());
  298. for (int i = 0; i < item.value->greyRanges.size(); ++i) {
  299. double left;
  300. double right;
  301. int lloc = full.indexOf(item.value->greyRanges.at(i).leftValue);
  302. int rloc = full.indexOf(item.value->greyRanges.at(i).rightValue);
  303. if (lloc == 0) {
  304. left = full[0];
  305. } else {
  306. left = full[lloc - 1];
  307. }
  308. if (rloc == full.size() - 1) {
  309. right = full.last();
  310. } else {
  311. right = full[rloc + 1];
  312. }
  313. rg << GCERange { i, left, item.value->greyRanges.at(i).leftValue,
  314. item.value->greyRanges.at(i).rightValue, right };
  315. }
  316. ranges << rg;
  317. }
  318. }
  319. QScopedPointer<GreyClusterEvaluation> gc(new GreyClusterEvaluation(mat, ranges));
  320. gc->evaluate({ 0.2, 0.15, 0.05, 0.4, 0.2 });
  321. BestIndex index = gc->getBestIndex();
  322. qDebug() << index.front_index << index.back_index;
  323. }
  324. void GreyClusteringSampleTable::init()
  325. {
  326. setAlternatingRowColors(false);
  327. horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  328. horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  329. verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  330. verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  331. setSelectionMode(QAbstractItemView::SingleSelection);
  332. }
  333. void GreyClusteringSampleTable::loadData()
  334. {
  335. QList<GradeInfo *> gradeInfoList;
  336. QMap<QString, QString> grayLevelMaps;
  337. int projectId = m_mind->root().projectId;
  338. if (!GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, projectId, 1)) {
  339. QMessageBox::warning(this, "警告", "数据库访问失败");
  340. } else {
  341. if (gradeInfoList.size() == 0) {
  342. for (int lvl = 0; lvl < m_grayNumber; ++lvl) {
  343. grayLevelMaps.insert(QString("级别 %1:").arg(lvl + 1), QString("E%1").arg(lvl + 1));
  344. GradeInfo ginfo;
  345. ginfo.projectId = projectId;
  346. ginfo.gradeName = QString("级别 %1").arg(lvl + 1);
  347. ginfo.gradeValue = QString("灰类%1级").arg(lvl + 1);
  348. ginfo.type = 1;
  349. if (!GradeInfoService().AddGradeInfo(ginfo)) {
  350. QMessageBox::warning(this, "警告", "数据库访问失败");
  351. }
  352. }
  353. } else {
  354. for (const auto &gi : gradeInfoList) {
  355. grayLevelMaps.insert(gi->gradeName, gi->gradeValue);
  356. if (grayLevelMaps.size() >= m_grayNumber) {
  357. break;
  358. }
  359. }
  360. // 缺少再补
  361. for (int lvl = grayLevelMaps.size(); lvl < m_grayNumber; ++lvl) {
  362. grayLevelMaps.insert(QString("级别 %1:").arg(lvl + 1), QString("E%1").arg(lvl + 1));
  363. GradeInfo ginfo;
  364. ginfo.projectId = projectId;
  365. ginfo.gradeName = QString("级别 %1").arg(lvl + 1);
  366. ginfo.gradeValue = QString("灰类%1级").arg(lvl + 1);
  367. ginfo.type = 1;
  368. if (!GradeInfoService().AddGradeInfo(ginfo)) {
  369. QMessageBox::warning(this, "警告", "数据库访问失败");
  370. }
  371. }
  372. m_grayNames = grayLevelMaps.values();
  373. }
  374. }
  375. qDeleteAll(gradeInfoList);
  376. }
  377. void GreyClusteringSampleTable::loadSchemeData()
  378. {
  379. m_schemeData.clear();
  380. QList<SchemaEval *> schemeList;
  381. bool ret = SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_mind->root().projectId, 2);
  382. if (ret == false) {
  383. return;
  384. }
  385. for (SchemaEval *scheme : schemeList) {
  386. if (m_schemeData.keys().contains(scheme->name) == false) {
  387. m_schemeData[scheme->name] = QMap<QString, QString>();
  388. }
  389. QStringList valueStrList = scheme->valueStr.split(";");
  390. for (QString valueStr : valueStrList) {
  391. QStringList keyValue = valueStr.split(":");
  392. if (keyValue.size() == 2) {
  393. m_schemeData[scheme->name][keyValue.first()] = keyValue.last();
  394. }
  395. }
  396. }
  397. }
  398. void GreyClusteringSampleTable::initClusteringItems()
  399. {
  400. // 脑图层级 < 2 时无效
  401. if (m_mind->levels() < 2) {
  402. return;
  403. }
  404. m_greyClusterings.clear();
  405. // 使用倒数第二层节点及其子节点
  406. int row = 0;
  407. for (CNodeData n : m_mind->nodesInLevel(m_mind->levels() - 1)) {
  408. GreyClusteringItem parentItem = { n.name, row, 0, 1, 1, nullptr };
  409. QList<CNodeData> subNodes = m_mind->subNodes(n);
  410. parentItem.colSpan = subNodes.size() == 0 ? 2 : 1; // 没有子节点,占两列,否则占一列
  411. parentItem.rowSpan = subNodes.size() == 0 ? 1 : subNodes.size(); // 没有子节点,占一行,否则占子节点数目行
  412. if (subNodes.size() == 0) { // 没有子节点,需要录入值
  413. GreyClusteringValue *sg = new GreyClusteringValue;
  414. sg->units = n.dimension;
  415. sg->weiget = 0;
  416. for (const auto &gname : m_grayNames) {
  417. sg->greyRanges << GreyRange { gname, true, 0, true, 0 };
  418. }
  419. sg->leftExtension = 0;
  420. sg->rightExtension = 0;
  421. sg->oldValue = 0;
  422. sg->newValue = 0;
  423. parentItem.value.reset(sg);
  424. }
  425. m_greyClusterings.append(parentItem);
  426. int subRow = row;
  427. // 子节点
  428. for (const CNodeData &sub : subNodes) {
  429. // 因为已有父节点,所以在第2列
  430. GreyClusteringItem childItem = { sub.name, subRow, 1, 1, 1, nullptr };
  431. GreyClusteringValue *sg = new GreyClusteringValue;
  432. sg->units = sub.dimension;
  433. sg->weiget = 0;
  434. for (const auto &gname : m_grayNames) {
  435. sg->greyRanges << GreyRange { gname, true, 0, true, 0 };
  436. }
  437. sg->leftExtension = 0;
  438. sg->rightExtension = 0;
  439. sg->oldValue = 0;
  440. sg->newValue = 0;
  441. childItem.value.reset(sg);
  442. m_greyClusterings.append(childItem);
  443. subRow++;
  444. }
  445. row += parentItem.rowSpan;
  446. }
  447. m_rowCount = row;
  448. // 更新
  449. QList<EffectIndexInfo *> effectIndexInfoList;
  450. int projectid = m_mind->root().projectId;
  451. if (!EffectIndexInfoService().QueryEffectIndexInfoByProjectId(&effectIndexInfoList, projectid)) {
  452. QMessageBox::warning(this, "警告", "数据库访问失败");
  453. return;
  454. }
  455. if (effectIndexInfoList.size() > 0) {
  456. for (auto &item : m_greyClusterings) {
  457. if (item.value.isNull()) {
  458. continue;
  459. }
  460. for (const auto &effInfo : effectIndexInfoList) {
  461. if (effInfo->effectIndexName == item.indexName) {
  462. if (effInfo->effectIndexUnit.length() > 0) {
  463. item.value->units = effInfo->effectIndexUnit;
  464. }
  465. item.value->leftExtension = effInfo->extendLeft.toDouble();
  466. item.value->rightExtension = effInfo->extendRight.toDouble();
  467. //[0:0],[0:0],[0:0]
  468. QStringList valueList;
  469. if (effInfo->effectIndexValue.length() > 0) {
  470. valueList = effInfo->effectIndexValue.split(",");
  471. }
  472. int align = qMin(valueList.size(), item.value->greyRanges.size());
  473. for (int str = 0; str < align; str++) {
  474. //[0:0]
  475. QStringList lr = valueList.at(str).mid(1, valueList.at(str).size() - 2).split(":");
  476. item.value->greyRanges[str].leftValue = lr.at(0).toDouble();
  477. item.value->greyRanges[str].rightValue = lr.at(1).toDouble();
  478. }
  479. }
  480. }
  481. }
  482. }
  483. qDeleteAll(effectIndexInfoList);
  484. if (projectid == kDemoProjId1) {
  485. 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 };
  486. 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 };
  487. int sn = 0;
  488. for (auto &item : m_greyClusterings) {
  489. if (item.value.isNull()) {
  490. continue;
  491. }
  492. if (sn < left.size()) {
  493. item.value->oldValue = left.at(sn);
  494. item.value->newValue = right.at(sn);
  495. }
  496. sn++;
  497. }
  498. }
  499. }