|
|
#include <QPainter>
|
|
|
|
|
|
#include <ZxSerializer.h>
|
|
|
#include "IxPtyPano.h"
|
|
|
|
|
|
#include "ZxSubAxisX.h"
|
|
|
#include "ZxSubAxisY.h"
|
|
|
|
|
|
#include "nmObjRoundOutlineTool.h"
|
|
|
#include "nmObjRoundOutline.h"
|
|
|
|
|
|
#include "nmDataLogFile.h"
|
|
|
|
|
|
#include "nmDataAnalyzeManager.h"
|
|
|
|
|
|
ZX_DEFINE_DYNAMIC(nObjRoundOutline, nmObjRoundOutline)
|
|
|
|
|
|
nmObjRoundOutline::nmObjRoundOutline()
|
|
|
{
|
|
|
m_sObjTag = "nObjRoundOutline";
|
|
|
nmObjRoundOutline::init("", NULL, NULL);
|
|
|
}
|
|
|
|
|
|
nmObjRoundOutline::nmObjRoundOutline(const QString& sName, \
|
|
|
ZxSubAxisX* pAxisX, \
|
|
|
ZxSubAxisY* pAxisY)
|
|
|
{
|
|
|
m_sObjTag = "nObjRoundOutline";
|
|
|
nmObjRoundOutline::init(sName, pAxisX, pAxisY);
|
|
|
}
|
|
|
|
|
|
nmObjRoundOutline::~nmObjRoundOutline()
|
|
|
{
|
|
|
// 边界数据由DataManager统一释放,图元只保存引用。
|
|
|
m_outlineData = nullptr;
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::init(const QString& sName, \
|
|
|
ZxSubAxisX* pAxisX, \
|
|
|
ZxSubAxisY* pAxisY)
|
|
|
{
|
|
|
nmObjRound::init(sName, pAxisX, pAxisY);
|
|
|
m_outlineData = nullptr;
|
|
|
|
|
|
// 连接图元可见性信号和槽
|
|
|
connect(this, SIGNAL(sigObjVisibleChanged(bool)),
|
|
|
this, SLOT(onObjVisibleChanged(bool)));
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::initTools()
|
|
|
{
|
|
|
m_pTool = new nmObjRoundOutlineTool();
|
|
|
nmObjBase::initTools();
|
|
|
}
|
|
|
|
|
|
bool nmObjRoundOutline::hitTest(const QPointF& pt)
|
|
|
{
|
|
|
return nmObjRound::hitTest(pt);
|
|
|
}
|
|
|
|
|
|
bool nmObjRoundOutline::_runHitTest(const QPointF& pt, int& nOption, int& nSubIndex)
|
|
|
{
|
|
|
return nmObjRound::_runHitTest(pt, nOption, nSubIndex);
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::fillPtyPano(IxPtyPano* sheet)
|
|
|
{
|
|
|
nmObjRound::fillPtyPano(sheet);
|
|
|
// TODO,设置边界类型的
|
|
|
IxPtyItem* pProp = ZX_PROP("ObjPolygonOutline.Type", getCurOutlineFlowType, setCurOutlineFlowType);
|
|
|
if (NULL != pProp) {
|
|
|
QStringList listTags;
|
|
|
listTags << tr("No Flow") << tr("Constant Pressure");
|
|
|
QList<QVariant> listIndexes;
|
|
|
listIndexes << 0 << 1 << 2;
|
|
|
pProp->getPtyPano();
|
|
|
pProp->setOptions(listTags, listIndexes);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::setAllPos(QVector<QPointF> vecPoss, QVector<int> *pVecIndexes)
|
|
|
{
|
|
|
nmObjRound::setAllPos(vecPoss, pVecIndexes);
|
|
|
|
|
|
// 圆形只有一个边
|
|
|
if (m_vFlowTypeList.count() <1)
|
|
|
{
|
|
|
m_vFlowTypeList.append(NM_OIL_RESERVOIR_OUTLINE_TYPE::OIL_Reservoir_Outline_No_Flow);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::paintBack(QPainter* painter, const ZxPaintParam& param)
|
|
|
{
|
|
|
nmObjRound::paintBack(painter, param);
|
|
|
|
|
|
// 判断半径是否相同,不相同先修改半径相同
|
|
|
if (m_vecPoints[1].x() != m_vecPoints[1].y())
|
|
|
{
|
|
|
// 重新计算半径
|
|
|
// 计算半径(绝对值)
|
|
|
double radius = qAbs(m_vecPoints[0].y() - m_vecPoints[2].y());
|
|
|
|
|
|
// 更新 vecConvertPoints[1] 为 (radius, radius)
|
|
|
m_vecPoints[1] = QPointF(radius, radius);
|
|
|
}
|
|
|
|
|
|
QVector<QPointF> pts = getPosOf(m_vecPoints);
|
|
|
|
|
|
// 判断半径是否相同,不相同先修改半径相同
|
|
|
if (pts[1].x() != pts[1].y())
|
|
|
{
|
|
|
double radius = qAbs(pts[0].y() - pts[2].y());
|
|
|
pts[1] = QPointF(radius, radius);
|
|
|
|
|
|
// 重新计算圆上的四个点
|
|
|
QPointF center = pts[0]; // 圆心
|
|
|
|
|
|
// 上点 (x, y - radius)
|
|
|
pts[2] = QPointF(center.x(), center.y() - radius);
|
|
|
|
|
|
// 右点 (x + radius, y)
|
|
|
pts[3] = QPointF(center.x() + radius, center.y());
|
|
|
|
|
|
// 下点 (x, y + radius)
|
|
|
pts[4] = QPointF(center.x(), center.y() + radius);
|
|
|
|
|
|
// 左点 (x - radius, y)
|
|
|
pts[5] = QPointF(center.x() - radius, center.y());
|
|
|
}
|
|
|
|
|
|
if (m_outlineData != nullptr)
|
|
|
{
|
|
|
// 动态更新当前边界数据
|
|
|
m_outlineData->setName(m_sName);
|
|
|
|
|
|
double qradius = m_vecPoints[2].y() - m_vecPoints[0].y(); // 圆形正上方顶点 y - 圆心 y
|
|
|
m_outlineData->setRadius(qradius); // 半径
|
|
|
|
|
|
m_outlineData->setCenter(m_vecPoints[0]); // 圆心
|
|
|
m_outlineData->setFlowTypeList(m_vFlowTypeList);
|
|
|
|
|
|
// 将点数组也存入数据中心,方便利用数据直接绘制图元
|
|
|
m_outlineData->setOutlinePoints(m_vecPoints);
|
|
|
}
|
|
|
|
|
|
if (isSelected()) { //选中状态下
|
|
|
QPen pen(QBrush(Qt::black), 0.0f, Qt::DotLine);
|
|
|
painter->setPen(pen);
|
|
|
painter->drawEllipse(pts[0], pts[1].x(),pts[1].y());
|
|
|
|
|
|
for (int i = 2; i < pts.count(); i++) {
|
|
|
float w = 2.2f;
|
|
|
QPointF pt = pts[i];
|
|
|
QRectF rect(pt.x() - w * 0.5f, pt.y() - w * 0.5f, w, w);
|
|
|
// 渲染节点
|
|
|
painter->setPen(QColor(0, 0, 128));
|
|
|
painter->drawRect(rect); //四个点画矩形
|
|
|
}
|
|
|
|
|
|
// 如果是选中的边,则显示绿色
|
|
|
if (m_oHitOption == OHO_Inner) {
|
|
|
QPen pen;
|
|
|
pen.setWidth(1); // 设置线条宽度
|
|
|
pen.setColor(Qt::green); // 设置线条颜色
|
|
|
painter->setPen(pen);
|
|
|
painter->drawEllipse(pts[0], pts[1].x(),pts[1].y());
|
|
|
}
|
|
|
}
|
|
|
painter->restore();
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::setCurOutlineFlowType(int flowType)
|
|
|
{
|
|
|
if (m_oHitOption == OHO_Point || m_oHitOption == OHO_Bound || m_oHitOption == OHO_Inner) {
|
|
|
m_vFlowTypeList[0] = flowType;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int nmObjRoundOutline::getCurOutlineFlowType()
|
|
|
{
|
|
|
return m_vFlowTypeList[0];
|
|
|
}
|
|
|
|
|
|
nmDataOutline* nmObjRoundOutline::getOutlineData() const {
|
|
|
return m_outlineData;
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::setOutlineData(nmDataOutline* newOutlineData) {
|
|
|
m_outlineData = newOutlineData;
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::afterCreated() {
|
|
|
m_outlineData = nmDataAnalyzeManager::getCurrentInstance()->createOutline();
|
|
|
m_outlineData->setName(m_sName);
|
|
|
m_outlineData->setFlowTypeList(m_vFlowTypeList);
|
|
|
double qradius = m_vecPoints[2].y() - m_vecPoints[0].y(); // 圆形正上方顶点 y - 圆心 y
|
|
|
m_outlineData->setRadius(qradius); // 半径
|
|
|
|
|
|
m_outlineData->setCenter(m_vecPoints[0]); // 圆心
|
|
|
|
|
|
m_outlineData->setOutlineType(NM_Data_Outline_Type::NM_Round_Outline_Type);
|
|
|
|
|
|
// 将点数组也存入数据中心,方便利用数据直接绘制图元
|
|
|
m_outlineData->setOutlinePoints(m_vecPoints);
|
|
|
nmDataAnalyzeManager::getCurrentInstance()->notifyDataChanged();
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::removeData() {
|
|
|
if (m_outlineData) {
|
|
|
// 从数据中心移除该数据
|
|
|
nmDataAnalyzeManager::getCurrentInstance()->removeOutlineData();
|
|
|
//delete m_outlineData;
|
|
|
m_outlineData = nullptr;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void nmObjRoundOutline::onObjVisibleChanged(bool bIsVisible) {
|
|
|
if (m_outlineData != nullptr) {
|
|
|
m_outlineData->setPlotVisible(bIsVisible);
|
|
|
}
|
|
|
}
|