|
|
|
|
@ -12,8 +12,8 @@
|
|
|
|
|
#include "ZxBaseUtil.h"
|
|
|
|
|
#include "ZxPlot.h"
|
|
|
|
|
|
|
|
|
|
#include "nmDataAnalyzeManager.h"
|
|
|
|
|
#include "nmDataRegionMark.h"
|
|
|
|
|
#include "nmPlotGraphicBinder.h"
|
|
|
|
|
#include "nmDataRegion.h"
|
|
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
|
|
@ -35,9 +35,6 @@ nmObjRegion::nmObjRegion(const QString& sName, \
|
|
|
|
|
|
|
|
|
|
nmObjRegion::~nmObjRegion()
|
|
|
|
|
{
|
|
|
|
|
// 复合区数据由DataManager统一释放,图元只保存引用。
|
|
|
|
|
m_regionData = nullptr;
|
|
|
|
|
|
|
|
|
|
if(m_regionMark != nullptr) {
|
|
|
|
|
m_regionMark = nullptr;
|
|
|
|
|
}
|
|
|
|
|
@ -55,7 +52,9 @@ void nmObjRegion::init(const QString& sName, \
|
|
|
|
|
m_clrBackgrd = QColor(0, 0, 0, 0);
|
|
|
|
|
|
|
|
|
|
m_regionMark = nullptr;
|
|
|
|
|
m_regionData = nullptr;
|
|
|
|
|
m_pGraphicBinder = nullptr;
|
|
|
|
|
m_sFlowModel = tr("Leaky");
|
|
|
|
|
m_dLeakage = 1.0;
|
|
|
|
|
|
|
|
|
|
loadTempl();
|
|
|
|
|
|
|
|
|
|
@ -206,14 +205,15 @@ void nmObjRegion::onSerialize(ZxSerializer* ser)
|
|
|
|
|
nmObjBase::onSerialize(ser);
|
|
|
|
|
int flowModel;
|
|
|
|
|
|
|
|
|
|
if(m_regionData->getRegionFlowModel().getValue() == tr("Leaky"))
|
|
|
|
|
if(m_sFlowModel == tr("Leaky"))
|
|
|
|
|
flowModel = 0;
|
|
|
|
|
else
|
|
|
|
|
flowModel = 1;
|
|
|
|
|
|
|
|
|
|
ser->write("FlowModel", flowModel);
|
|
|
|
|
ser->write("Leakage", m_regionData->getRegionFlowModel().getValue().toDouble());
|
|
|
|
|
ser->write("Leakage", m_dLeakage);
|
|
|
|
|
ser->write("BackgrdColor", m_clrBackgrd);
|
|
|
|
|
ser->write("PenWidth", m_oPen.widthF());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::onDeserialize(ZxSerializer* ser)
|
|
|
|
|
@ -221,10 +221,14 @@ void nmObjRegion::onDeserialize(ZxSerializer* ser)
|
|
|
|
|
nmObjBase::onDeserialize(ser);
|
|
|
|
|
int flowModel;
|
|
|
|
|
double regionLeakage;
|
|
|
|
|
double penWidth;
|
|
|
|
|
ser->read("FlowModel", flowModel);
|
|
|
|
|
ser->read("Leakage", regionLeakage);
|
|
|
|
|
ser->read("BackgrdColor", m_clrBackgrd);
|
|
|
|
|
ser->read("PenWidth", penWidth);
|
|
|
|
|
m_oPen.setWidthF(penWidth);
|
|
|
|
|
|
|
|
|
|
this->setRegionFlowModel(flowModel);
|
|
|
|
|
this->setRegionLeakage(regionLeakage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -233,14 +237,15 @@ void nmObjRegion::onSaveTempl(ZxSerializer* ser)
|
|
|
|
|
nmObjBase::onSaveTempl(ser);
|
|
|
|
|
int flowModel;
|
|
|
|
|
|
|
|
|
|
if(m_regionData->getRegionFlowModel().getValue() == tr("Leaky"))
|
|
|
|
|
if(m_sFlowModel == tr("Leaky"))
|
|
|
|
|
flowModel = 0;
|
|
|
|
|
else
|
|
|
|
|
flowModel = 1;
|
|
|
|
|
|
|
|
|
|
ser->write("FlowModel", flowModel);
|
|
|
|
|
ser->write("Leakage", m_regionData->getRegionFlowModel().getValue().toDouble());
|
|
|
|
|
ser->write("Leakage", m_dLeakage);
|
|
|
|
|
ser->write("BackgrdColor", m_clrBackgrd);
|
|
|
|
|
ser->write("PenWidth", m_oPen.widthF());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::onLoadTempl(ZxSerializer* ser)
|
|
|
|
|
@ -248,10 +253,14 @@ void nmObjRegion::onLoadTempl(ZxSerializer* ser)
|
|
|
|
|
nmObjBase::onLoadTempl(ser);
|
|
|
|
|
int flowModel;
|
|
|
|
|
double regionLeakage;
|
|
|
|
|
double penWidth;
|
|
|
|
|
ser->read("FlowModel", flowModel);
|
|
|
|
|
ser->read("Leakage", regionLeakage);
|
|
|
|
|
ser->read("BackgrdColor", m_clrBackgrd);
|
|
|
|
|
ser->read("PenWidth", penWidth);
|
|
|
|
|
m_oPen.setWidthF(penWidth);
|
|
|
|
|
|
|
|
|
|
this->setRegionFlowModel(flowModel);
|
|
|
|
|
this->setRegionLeakage(regionLeakage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -280,26 +289,13 @@ void nmObjRegion::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
painter->save();
|
|
|
|
|
QVector<QPointF> pts = getPosOf(m_vecPoints);
|
|
|
|
|
|
|
|
|
|
if(m_regionData != nullptr) {
|
|
|
|
|
m_regionData->setRegionName(m_sName);
|
|
|
|
|
m_regionData->setVecPts(m_vecPoints);
|
|
|
|
|
|
|
|
|
|
if(m_regionMark == nullptr) {
|
|
|
|
|
if(m_regionData->getRegionMarkData() != nullptr)
|
|
|
|
|
m_regionData->setRegionMarkData(nullptr);
|
|
|
|
|
|
|
|
|
|
} else if(m_regionMark->getRegionMarkData() == nullptr) {
|
|
|
|
|
m_regionMark = nullptr;
|
|
|
|
|
m_regionData->setRegionMarkData(nullptr);
|
|
|
|
|
this->setBackgrdColor(QColor(0, 0, 0, 0));
|
|
|
|
|
} else {
|
|
|
|
|
m_regionData->setRegionMarkData(m_regionMark->getRegionMarkData());
|
|
|
|
|
// 通过 Binder 同步数据到数据中心
|
|
|
|
|
if (m_pGraphicBinder) {
|
|
|
|
|
m_pGraphicBinder->syncRegionData(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
painter->save();
|
|
|
|
|
QVector<QPointF> pts = getPosOf(m_vecPoints);
|
|
|
|
|
|
|
|
|
|
// 不选中的状态
|
|
|
|
|
if(!pts.empty()) {
|
|
|
|
|
@ -315,7 +311,7 @@ void nmObjRegion::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
oPath.closeSubpath();
|
|
|
|
|
painter->fillPath(oPath, QBrush(m_clrBackgrd));
|
|
|
|
|
|
|
|
|
|
// 判断标记区域对象的点是否存在
|
|
|
|
|
// 判断标记区域对象的点是否仍在区域内
|
|
|
|
|
if(m_regionMark != nullptr) {
|
|
|
|
|
QPointF ptPos = getValueOf(m_regionMark->getAllPos()[0]);
|
|
|
|
|
|
|
|
|
|
@ -324,7 +320,6 @@ void nmObjRegion::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
if(!regionPolygon.containsPoint(ptPos, Qt::OddEvenFill)) {
|
|
|
|
|
this->setBackgrdColor(QColor(0, 0, 0, 0));
|
|
|
|
|
m_regionMark->setSelectRegion(false);
|
|
|
|
|
m_regionMark->getRegionMarkData()->setSelectRegion(false);
|
|
|
|
|
m_regionMark = nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -386,7 +381,7 @@ void nmObjRegion::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
|
|
|
|
|
|
|
int nmObjRegion::getRegionFlowModel()
|
|
|
|
|
{
|
|
|
|
|
if(m_regionData->getRegionFlowModel().getValue() == tr("Leaky"))
|
|
|
|
|
if(m_sFlowModel == tr("Leaky"))
|
|
|
|
|
return 0;
|
|
|
|
|
else
|
|
|
|
|
return 1;
|
|
|
|
|
@ -394,29 +389,23 @@ int nmObjRegion::getRegionFlowModel()
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::setRegionFlowModel(int newRegionFlowModel)
|
|
|
|
|
{
|
|
|
|
|
// 从Data中取数据
|
|
|
|
|
nmDataAttribute tempAttr = m_regionData->getRegionFlowModel();
|
|
|
|
|
|
|
|
|
|
if(newRegionFlowModel == 0) {
|
|
|
|
|
tempAttr.setValue(tr("Leaky"));
|
|
|
|
|
m_sFlowModel = tr("Leaky");
|
|
|
|
|
} else {
|
|
|
|
|
tempAttr.setValue(tr("Composite limit"));
|
|
|
|
|
m_sFlowModel = tr("Composite limit");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_regionData->setRegionFlowModel(tempAttr);
|
|
|
|
|
emit sigRegionFlowModelChanged(newRegionFlowModel);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double nmObjRegion::getRegionLeakage()
|
|
|
|
|
{
|
|
|
|
|
return m_regionData->getRegionLeakage().getValue().toDouble();
|
|
|
|
|
return m_dLeakage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::setRegionLeakage(double newRegionLeakage)
|
|
|
|
|
{
|
|
|
|
|
// 从Data中取数据
|
|
|
|
|
nmDataAttribute tempAttr = m_regionData->getRegionLeakage();
|
|
|
|
|
tempAttr.setValue(newRegionLeakage);
|
|
|
|
|
m_regionData->setRegionLeakage(tempAttr);
|
|
|
|
|
m_dLeakage = newRegionLeakage;
|
|
|
|
|
emit sigRegionLeakageChanged(newRegionLeakage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::setRegionMark(nmObjRegionMark* newRegionMark)
|
|
|
|
|
@ -429,14 +418,11 @@ nmObjRegionMark* nmObjRegion::getRegionMark() const
|
|
|
|
|
return m_regionMark;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::setRegionData(nmDataRegion* newRegionData)
|
|
|
|
|
{
|
|
|
|
|
m_regionData = newRegionData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nmDataRegion* nmObjRegion::getRegionData() const
|
|
|
|
|
{
|
|
|
|
|
return m_regionData;
|
|
|
|
|
if (m_pGraphicBinder)
|
|
|
|
|
return m_pGraphicBinder->getRegionDataFor(const_cast<nmObjRegion*>(this));
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//鞋带公式计算多边形有向面积。
|
|
|
|
|
@ -472,38 +458,23 @@ void nmObjRegion::reorderPointsToAntiClockwise()
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::afterCreated()
|
|
|
|
|
{
|
|
|
|
|
m_regionData = nmDataAnalyzeManager::getCurrentInstance()->createRegion();
|
|
|
|
|
// 初始化复合区基础数据
|
|
|
|
|
m_regionData->setRegionName(m_sName);
|
|
|
|
|
|
|
|
|
|
// 在区域创建完成后,调用重新排序函数确保点的顺序为顺时针
|
|
|
|
|
reorderPointsToAntiClockwise();
|
|
|
|
|
m_regionData->setVecPts(m_vecPoints);
|
|
|
|
|
|
|
|
|
|
// 判断复合区是否被区域标记
|
|
|
|
|
if(m_regionMark == nullptr) {
|
|
|
|
|
if(m_regionData->getRegionMarkData() != nullptr)
|
|
|
|
|
m_regionData->setRegionMarkData(nullptr);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加区域标记对象
|
|
|
|
|
m_regionData->setRegionMarkData(m_regionMark->getRegionMarkData());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::removeData()
|
|
|
|
|
{
|
|
|
|
|
if(m_regionData) {
|
|
|
|
|
// 从数据中心移除该数据
|
|
|
|
|
nmDataAnalyzeManager::getCurrentInstance()->removeRegionData(m_regionData);
|
|
|
|
|
m_regionData = nullptr;
|
|
|
|
|
if (m_pGraphicBinder) {
|
|
|
|
|
m_pGraphicBinder->removeRegionBinding(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmObjRegion::onObjVisibleChanged(bool bIsVisible)
|
|
|
|
|
{
|
|
|
|
|
if(m_regionData != nullptr) {
|
|
|
|
|
m_regionData->setPlotVisible(bIsVisible);
|
|
|
|
|
if (m_pGraphicBinder) {
|
|
|
|
|
nmDataRegion* pData = m_pGraphicBinder->getRegionDataFor(this);
|
|
|
|
|
if (pData) {
|
|
|
|
|
pData->setPlotVisible(bIsVisible);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|