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.
nmWTAI-Platform/Src/nmNum/nmPlot/nmObjRoundOutline.cpp

222 lines
6.0 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 <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);
}
}