You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWATI/Src/nmNum/nmSubWnd/nmSubWndDemo.cpp

540 lines
15 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "zxLogInstance.h"
#include "ZxBaHelper.h"
#include "ZxResolutionHelper.h"
#include "zxSysUtils.h"
#include "ZxPtyDock.h"
#include "iDockBaseWx.h"
#include "ZxMainWindow.h"
#include "ZxSubAxisX.h"
#include "ZxSubAxisY.h"
#include "ZxPlot.h"
#include "ZxObjCurve.h"
#include "ZxSubTitle.h"
#include "tCurvePlotScene.h"
#include "tCurvePlotView.h"
#include "ZxTableView.h"
#include "ZxTableModel.h"
#include "mModuleDefines.h"
#include "ZxDataWell.h"
#include "ZxDataProject.h"
#include "ZxRstJobWnd.h"
#ifdef QT_DEBUG
#include "ZxDataGaugeP.h"
#endif
#ifdef QT_DEBUG
#include "nmXmlHelper.h"
#endif
#include "nmGuiPlot.h"
#include "nmWxParaProperty.h"
#include "nmSubWndDemo.h"
nmSubWndDemo::nmSubWndDemo(QWidget *parent, QString sExt) :
iSubWndBaseAF(parent, sExt)
{
m_pWxPlot = NULL;
m_pWxDockParas = NULL;
m_pWxParas = NULL;
m_pWxDockData1 = NULL;
m_pTableView1 = NULL;
m_pWxDockData2 = NULL;
m_pTableView2 = NULL;
#ifdef QT_DEBUG
m_pWxDockTemp = NULL;
m_pListWxTemp = NULL;
#endif
// 为了后续支持多井提供方便
if (m_pDataWell == NULL) {
m_pDataWell = zxCurWell;
}
m_sMdiWndType = s_MdiType_DataNum;
setWindowTitle(tr("nmSubWndDemo"));
}
nmSubWndDemo::~nmSubWndDemo()
{
#ifdef QT_DEBUG
// 坚持谁创建谁析构原则,删除(首先需要去除绑定)
if (NULL != m_pWxDockTemp) {
//QObject* pParent = m_pWxDockTemp->parent();
//ZxMainWindow* p = dynamic_cast<ZxMainWindow*>(pParent);
ZxMainWindow* p = m_pMainWindow;
if (NULL != p) {
p->detachOuterDockWx(m_pWxDockTemp);
}
delete m_pWxDockTemp;
m_pWxDockTemp = NULL;
}
#endif
}
void nmSubWndDemo::configWnd()
{
iSubWndBaseAF::configWnd();
if (NULL != m_pMainWindow) {
disconnect(this, SIGNAL(sigAppendDock2Main(iDockBaseWx*, Qt::DockWidgetArea)), \
m_pMainWindow, SLOT(slotAppendDock2Main(iDockBaseWx*, Qt::DockWidgetArea)));
connect(this, SIGNAL(sigAppendDock2Main(iDockBaseWx*, Qt::DockWidgetArea)), \
m_pMainWindow, SLOT(slotAppendDock2Main(iDockBaseWx*, Qt::DockWidgetArea)));
}
initUI();
}
void nmSubWndDemo::initUI()
{
// iSubWndBaseAF::initUI();
#ifdef QT_DEBUG
// 示例演示增加Dock并且追加至程序主窗口
initUiTop();
#endif
// 主布局:定义
initUiMain();
// 外围布局DockWx
{
initUiDockWxs();
initUiDockPtys();
}
#ifdef QT_DEBUG
// 示例如何加载xml文件
if (_nmXmlHelper->loadXmlDefines()) {
foreach (nmXmlData* pData, *(_nmXmlHelper->getVecNmXmlDataPtrs())) {
Q_ASSERT (NULL != pData);
zxLogRunD(QString("%1: %2").arg(pData->m_sName).arg(pData->m_sAlias));
}
}
#endif
}
QWidget* nmSubWndDemo::initUiMainWx()
{
QSplitter* pSplitter = new QSplitter(Qt::Vertical);
Q_ASSERT (NULL != pSplitter);
nmGuiPlot* pWxPlot = new nmGuiPlot();
m_pWxPlot = pWxPlot;
{
// 建立信号,以便在此处增加新的工具
connect(pWxPlot, SIGNAL(sigToolbarBuilt(QToolBar*)),
this, SLOT(slotToolbarBuilt(QToolBar*)));
QSize sz = QSize(265, 203);
pWxPlot->initUI("TestGui", sz);
bindChartSignals(pWxPlot);
pSplitter->addWidget(pWxPlot);
}
return pSplitter;
}
void nmSubWndDemo::initUiDockWxs()
{
// 基础参数Dock
{
m_pWxDockParas = new iDockBaseWx(tr("Parameters"));
Q_ASSERT (NULL != m_pWxDockParas);
addDockWidget(Qt::LeftDockWidgetArea, m_pWxDockParas);
m_pWxParas = new nmWxParaProperty();
Q_ASSERT (NULL != m_pWxParas);
m_pWxParas->initUI();
m_pWxDockParas->setWidget(m_pWxParas);
m_pWxDockParas->setMinimumWidth(_resoSizeW(200));
}
// 表格数据Dock
{
QStringList listTitles;
listTitles << tr("Name1");
iDockBaseWx* pDockWx1 = new iDockBaseWx(tr("Data1"));
Q_ASSERT (NULL != pDockWx1);
{
addDockWidget(Qt::RightDockWidgetArea, pDockWx1);
m_pWxDockData1 = pDockWx1;
ZxTableView* pTableView = new ZxTableView();
Q_ASSERT (NULL != pTableView);
{
ZxTableModel* pTableModel = new ZxTableModel(1, 1, listTitles);
Q_ASSERT (NULL != pTableModel);
pTableView->setModel(pTableModel);
pTableView->setMenuMode(ZxTableView::MTM_Edit_Without_Col);
pTableView->setSelectionBehavior(ZxTableView::SelectRows);
pTableView->fuzzyUiOfQt5();
}
pDockWx1->setWidget(pTableView);
m_pTableView1 = pTableView;
}
iDockBaseWx* pDockWx2 = new iDockBaseWx(tr("Data2"));
Q_ASSERT (NULL != pDockWx2);
{
addDockWidget(Qt::RightDockWidgetArea, pDockWx2);
tabifyDockWidget(pDockWx1, pDockWx2);
m_pWxDockData2 = pDockWx2;
ZxTableView* pTableView = new ZxTableView();
Q_ASSERT (NULL != pTableView);
{
ZxTableModel* pTableModel = new ZxTableModel(1, 1, listTitles);
Q_ASSERT (NULL != pTableModel);
pTableView->setModel(pTableModel);
pTableView->setMenuMode(ZxTableView::MTM_Readonly);
pTableView->fuzzyUiOfQt5();
}
pDockWx2->setWidget(pTableView);
m_pTableView2 = pTableView;
}
}
}
void nmSubWndDemo::initUiDockPtys()
{
iSubWndBaseAF::initUiDockPtys();
// 属性Dock
{
Q_ASSERT (NULL != m_pDockPty);
m_pDockPty->setMinimumWidth(_resoSizeW(200));
}
}
#ifdef QT_DEBUG
// 示例演示增加Dock并且追加至程序主窗口
void nmSubWndDemo::initUiTop()
{
// 基础参数Dock
{
iDockBaseWx* pDockWx = new iDockBaseWx(tr("TODO:Demo"));
Q_ASSERT (NULL != pDockWx);
QListWidget* pListWx = new QListWidget();
Q_ASSERT (NULL != pListWx);
pDockWx->setWidget(pListWx);
m_pListWxTemp = pListWx;
pDockWx->setMinimumWidth(_resoSizeW(200));
emit sigAppendDock2Main(pDockWx, Qt::LeftDockWidgetArea);
m_pWxDockTemp = pDockWx;
}
}
#endif
void nmSubWndDemo::bindChartSignals(iGuiPlot* pWxPlot)
{
nmGuiPlot* p = dynamic_cast<nmGuiPlot*>(pWxPlot);
if (NULL != p) {
connect(p, SIGNAL(sigObjSelChanged(ZxObjBase*, bool)), \
this, SLOT(slotObjSelChanged(ZxObjBase*, bool)));
connect(p, SIGNAL(sigObjPtsChanged(ZxObjBase*)),
this, SLOT(slotObjPtsChanged(ZxObjBase*)));
}
iSubWndBaseAF::bindChartSignals(pWxPlot);
}
bool nmSubWndDemo::runActionOf(QString sAction)
{
if (iSubWnd::runActionOf(sAction)) {
return true;
}
// 数据加载
QString s = sAction;
if (_isSame(s, "LoadP")) {
return true;
}
return false;
}
bool nmSubWndDemo::runCmdBy(QString sName, QString sID)
{
QString s = sName;
if (_isSame(s, "RunGrid")) {
if (NULL != m_pWxPlot) {
//m_pWxPlot->refreshGrid(true);
}
return true;
}
return false;
}
bool nmSubWndDemo::checkCmdEnable(bool &b, \
QString sName, int nID, \
bool bLicensed)
{
bool b1 = (NULL != zxCurProject);
bool b2 = (NULL != m_pDataWell);
if (nID == 5102) { //RunGrid
b = (b1 && b2 && bLicensed && !isReadonly() && NULL != m_pWxPlot);
return true;
}
return iSubWndBaseAF::checkCmdEnable(b, sName, nID, bLicensed);
}
void nmSubWndDemo::reAdjustToolbar(QToolBar* pToolBar)
{
iSubWndBaseAF::reAdjustToolbar(pToolBar);
}
void nmSubWndDemo::firstLoadAndUpdate()
{
iSubWndBaseAF::firstLoadAndUpdate();
}
void nmSubWndDemo::finalDeals()
{
iSubWndBaseAF::finalDeals();
#ifdef QT_DEBUG
updatePlots();
updateDockWxs();
Q_ASSERT (NULL != m_pWxDockData1);
m_pWxDockData1->raise();
#endif
}
void nmSubWndDemo::onActivated()
{
#ifdef QT_DEBUG
// 当前窗体激活时可以做些事情比如把隐藏的Dock显示出来
if (NULL != m_pWxDockTemp) {
if (!m_pWxDockTemp->isVisible()) {
m_pWxDockTemp->setVisible(true);
}
}
#endif
}
#ifdef QT_DEBUG
void nmSubWndDemo::updatePlots()
{
// 说明:以从当前井获取一条压力数据进行绘图为例
QString sType = iDataModelType::sTypeDataGaugeP;
QString sCodeP = ""; //如果已知压力数据Code可以直接引用
ZxDataGaugeP* pDataObjP = dynamic_cast<ZxDataGaugeP*>(getDataObjOf(sType, sCodeP));
if (NULL == pDataObjP) {
zxLogRunW(tr("Failed to get data of type '%1'").arg(sType));
return;
}
VecFloat vecX, vecY;
QByteArray ba = pDataObjP->getGaugeDataOf(0);
if (!ZxBaHelper::convertBa2VecXY(vecX, vecY, ba)) {
zxLogRunW(tr("Failed to get x-y data of dataobj '%1'").arg(pDataObjP->getCode()));
return;
}
nmGuiPlot* pWxPlot = m_pWxPlot;
Q_ASSERT (NULL != pWxPlot);
QString sName = tr("CurveName");
ZxObjBase* pObj = pWxPlot->updatePlotObjBy(sName, vecX, vecY, true);
if (NULL != pObj) {
pObj->setLockPos(true); //可以调整属性
// pObj->setReadOnly(true);
pWxPlot->freshAxisScales(true);//刷新坐标轴刻度
// 设置标题+坐标轴等
pWxPlot->setAxisX(tr("Time"), "hr");
pWxPlot->setAxisY(tr("Pressure"), "MPa");
pWxPlot->setAxisXYLog(false, 0);
pWxPlot->setAxisXYLog(false, 1);
pWxPlot->m_pPlot->setLegendVisible(false);
pWxPlot->m_pPlot->getTitle()->setName(tr("Demo"));
}
}
ZxDataObject* nmSubWndDemo::getDataObjOf(QString sType, QString sCode /*= ""*/)
{
ZxDataWell* pDataWell = zxCurWell;
Q_ASSERT (NULL != pDataWell);
ZxDataObject* pDataObj = NULL;
if (!sCode.isEmpty()) {
pDataObj = pDataWell->getChild(sType, sCode);
} else {
ZxDataObjectList vecObjs = pDataWell->getChildren(sType);
if (!vecObjs.isEmpty()) {
pDataObj = vecObjs[0];
}
}
return pDataObj;
}
void nmSubWndDemo::updateDockWxs()
{
// 左侧参数窗体
Q_ASSERT (NULL != m_pWxParas);
QStringList listParas;
listParas << "K" << "S" << "rw" << "Miuo" << "Bo" << "phi";
m_pWxParas->refreshUIs(listParas);
// 表格数据1
Q_ASSERT (NULL != m_pTableView1);
ZxTableModel* pTableModel = m_pTableView1->getModel();
Q_ASSERT (NULL != pTableModel);
QStringList listTitles;
listTitles << tr("Col1") << tr("Col2\n(MPa)");
VVecDouble vvec;
{
VecDouble vec;
vec << 0.2 << 3.4;
vvec << vec;
}
{
VecDouble vec;
vec << 5.6 << 0.456;
vvec << vec;
}
pTableModel->setTitles(listTitles);
pTableModel->setData(vvec);
if (NULL != m_pListWxTemp) {
m_pListWxTemp->clear();
for (int i = 0; i < 10; i++) {
QString sItem = tr("Demo Item %1").arg(i + 1);
QListWidgetItem* pItem = new QListWidgetItem(sItem);
Q_ASSERT (NULL != pItem);
pItem->setIcon(zxLoadIcon("Open"));
m_pListWxTemp->addItem(pItem);
}
}
}
void nmSubWndDemo::updateTableByCurve(ZxObjCurve* pObjCurve, ZxTableView* pTableView)
{
Q_ASSERT (NULL != pObjCurve);
Q_ASSERT (NULL != pTableView);
// 刷新表格标题
{
QString sNameX = pObjCurve->getAxisX()->getName();
QString sUnit = pObjCurve->getAxisX()->getUnit();
if (!sUnit.isEmpty()) {
sNameX += QString("\n(%1)").arg(sUnit);
}
QString sNameY = pObjCurve->getAxisY()->getName();
sUnit = pObjCurve->getAxisY()->getUnit();
if (!sUnit.isEmpty()) {
sNameY += QString("\n(%1)").arg(sUnit);
}
QStringList listTitles;
listTitles << sNameX << sNameY;
pTableView->getModel()->setTitles(listTitles);
}
// 刷新表格数据
{
VVecDouble vvec;
QVector<QPointF> vecValues = pObjCurve->getAllValues();
for (int i = 0; i < vecValues.count(); i++) {
VecDouble vec;
vec << vecValues.at(i).x() * 1.0;
vec << vecValues.at(i).y() * 1.0;
vvec << vec;
}
pTableView->getModel()->setData(vvec);
}
}
#endif
void nmSubWndDemo::slotObjSelChanged(ZxObjBase* p, bool b)
{
#ifdef QT_DEBUG
// 如果选中了一条曲线则把其数据显示在数据表格2中
ZxObjCurve* pObjCurve = dynamic_cast<ZxObjCurve*>(p);
if (NULL != pObjCurve && b) {
Q_ASSERT (NULL != m_pWxDockData2);
m_pWxDockData2->raise();
updateTableByCurve(pObjCurve, m_pTableView2);
}
#endif
}
void nmSubWndDemo::slotObjPtsChanged(ZxObjBase* p)
{
}
void nmSubWndDemo::onSerialize(ZxSerializer* ser)
{
iSubWndBaseAF::onSerialize(ser);
if (NULL != m_pWxPlot) {
m_pWxPlot->setModified(false);
}
}
void nmSubWndDemo::onDeserialize(ZxSerializer* ser)
{
iSubWndBaseAF::onDeserialize(ser);
if (NULL != m_pWxPlot) {
m_pWxPlot->setModified(false);
}
}
void nmSubWndDemo::onDeserialized()
{
if (NULL != m_pWxPlot) {
m_pWxPlot->resetAfterDeserialized();
}
}
bool nmSubWndDemo::loadRss()
{
ZxRstJobWnd* pRstWnd = getRstJobWnd();
Q_ASSERT (NULL != pRstWnd);
// 基础信息
{
QByteArray v = pRstWnd->getDataInfo();
IxSerDes* pSerObj = this;
if (!loadRstInfoFromArr(v, pSerObj)) {
return false;
}
}
// 图形
if (NULL != m_pWxPlot) {
QByteArray v = pRstWnd->getDataInfo1();
ZxPlot* pPlot = NULL;
loadOnePlot(pPlot, v);
if (NULL != pPlot) {
m_pWxPlot->m_pPlotScene->freshToPlot(pPlot,
m_pWxPlot->m_pPlotView);
m_pWxPlot->m_pPlot = m_pWxPlot->m_pPlotScene->m_pPlot;
pPlot->resetTools(m_pWxPlot->m_pPlotView);
m_pWxPlot->resetAfterDeserialized();
}
m_pWxPlot->runUpdate();
}
return true;
}
bool nmSubWndDemo::saveRss()
{
ZxRstJobWnd* pRstWnd = getRstJobWnd();
if (NULL == pRstWnd) {
return false;
}
// 基础信息
{
QByteArray v;
IxSerDes* pSerObj = this;
if (!saveRstInfoToArr(v, pSerObj)) {
return false;
}
pRstWnd->setDataInfo(v);
}
// 图形
if (NULL != m_pWxPlot) {
ZxPlot* pPlot = m_pWxPlot->m_pPlot;
{
QByteArray v1;
if (saveOnePlot(pPlot, v1)) {
pRstWnd->setDataInfo1(v1);
}
}
}
return pRstWnd->save();
}
bool nmSubWndDemo::slotSaveAll()
{
ZxRstJobWnd* pRstWnd = getRstJobWnd();
Q_ASSERT (NULL != pRstWnd);
return saveRss();
}
bool nmSubWndDemo::onConfirmClosing()
{
return iSubWndBaseAF::onConfirmClosing();
}