#include #include #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() { if (m_outlineData != nullptr) { delete m_outlineData; 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 listIndexes; listIndexes << 0 << 1 << 2; pProp->getPtyPano(); pProp->setOptions(listTags, listIndexes); } } void nmObjRoundOutline::setAllPos(QVector vecPoss, QVector *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 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); } }