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/nmObjRectOutline.cpp

289 lines
7.8 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 "nmObjRectOutlineTool.h"
#include "nmObjRectOutline.h"
#include "nmPlotGraphicBinder.h"
ZX_DEFINE_DYNAMIC(nObjRectOutline, nmObjRectOutline)
nmObjRectOutline::nmObjRectOutline()
: m_eChangeOutlineType(RBP_Unknown)
, m_pGraphicBinder(nullptr)
{
m_sObjTag = "nObjRectOutline";
nmObjRectOutline::init("", NULL, NULL);
}
nmObjRectOutline::nmObjRectOutline(const QString& sName, \
ZxSubAxisX* pAxisX, \
ZxSubAxisY* pAxisY)
: m_eChangeOutlineType(RBP_Unknown)
, m_pGraphicBinder(nullptr)
{
m_sObjTag = "nObjRectOutline";
nmObjRectOutline::init(sName, pAxisX, pAxisY);
}
nmObjRectOutline::~nmObjRectOutline()
{
}
void nmObjRectOutline::init(const QString& sName, \
ZxSubAxisX* pAxisX, \
ZxSubAxisY* pAxisY)
{
nmObjRect::init(sName, pAxisX, pAxisY);
m_pGraphicBinder = nullptr;
}
void nmObjRectOutline::initTools()
{
m_pTool = new nmObjRectOutlineTool();
nmObjBase::initTools();
}
bool nmObjRectOutline::hitTest(const QPointF& pt)
{
return nmObjRect::hitTest(pt);
}
bool nmObjRectOutline::_runHitTest(const QPointF& pt, int& nOption, int& nSubIndex)
{
return nmObjRect::_runHitTest(pt, nOption, nSubIndex);
}
void nmObjRectOutline::fillPtyPano(IxPtyPano* sheet)
{
nmObjRect::fillPtyPano(sheet);
// 设置边界类型,依次为上边界、右边界、下边界、左边界
IxPtyItem* pPropTop = ZX_PROP("ObjRectOutline.TopOutline", getTopOutlineFlowType, setTopOutlineFlowType);
IxPtyItem* pPropRight = ZX_PROP("ObjRectOutline.RightOutline", getRightOutlineFlowType, setRightOutlineFlowType);
IxPtyItem* pPropBottom = ZX_PROP("ObjRectOutline.BottomOutline", getBottomOutlineFlowType, setBottomOutlineFlowType);
IxPtyItem* pPropLeft = ZX_PROP("ObjRectOutline.LeftOutline", getLeftOutlineFlowType, setLeftOutlineFlowType);
if(NULL != pPropTop) {
QStringList listTags;
listTags << tr("No Flow") << tr("Constant Pressure");
QList<QVariant> listIndexes;
listIndexes << 0 << 1;
pPropTop->getPtyPano();
pPropTop->setOptions(listTags, listIndexes);
}
if(NULL != pPropRight) {
QStringList listTags;
listTags << tr("No Flow") << tr("Constant Pressure");
QList<QVariant> listIndexes;
listIndexes << 0 << 1;
pPropRight->getPtyPano();
pPropRight->setOptions(listTags, listIndexes);
}
if(NULL != pPropBottom) {
QStringList listTags;
listTags << tr("No Flow") << tr("Constant Pressure");
QList<QVariant> listIndexes;
listIndexes << 0 << 1;
pPropBottom->getPtyPano();
pPropBottom->setOptions(listTags, listIndexes);
}
if(NULL != pPropLeft) {
QStringList listTags;
listTags << tr("No Flow") << tr("Constant Pressure");
QList<QVariant> listIndexes;
listIndexes << 0 << 1;
pPropLeft->getPtyPano();
pPropLeft->setOptions(listTags, listIndexes);
}
}
void nmObjRectOutline::onSerialize(ZxSerializer* ser)
{
nmObjRect::onSerialize(ser);
ser->write("FlowTypeList", m_vFlowTypeList);
}
void nmObjRectOutline::onDeserialize(ZxSerializer* ser)
{
nmObjRect::onDeserialize(ser);
ser->read("FlowTypeList", m_vFlowTypeList);
}
void nmObjRectOutline::onLoadTempl(ZxSerializer* ser)
{
nmObjRect::onLoadTempl(ser);
ser->read("FlowTypeList", m_vFlowTypeList);
}
void nmObjRectOutline::onSaveTempl(ZxSerializer* ser)
{
nmObjRect::onSaveTempl(ser);
ser->write("FlowTypeList", m_vFlowTypeList);
}
void nmObjRectOutline::setAllPos(QVector<QPointF> vecPoss, QVector<int> *pVecIndexes)
{
nmObjRect::setAllPos(vecPoss, pVecIndexes);
// 根据点数确定边数以此来初始化m_vFlowTypeList
// 仅在列表不足时补充默认值,不阻止信号发射
while(m_vFlowTypeList.count() < vecPoss.count()) {
m_vFlowTypeList.append(NM_OIL_RESERVOIR_OUTLINE_TYPE::OIL_Reservoir_Outline_No_Flow);
}
emit sigOutlinePointsChanged();
}
void nmObjRectOutline::paintBack(QPainter* painter, const ZxPaintParam& param)
{
// 更新m_vecPoints点的顺序
this->reorderPoints(m_vecPoints);
nmObjRect::paintBack(painter, param);
QVector<QPointF> pts = getPosOf(m_vecPoints);
// 名称同步setName 不发信号,在绘制时通过 Binder 同步到数据中心
if (m_pGraphicBinder) {
m_pGraphicBinder->syncOutlineName(this);
m_pGraphicBinder->syncOutlineVisual(this);
}
if(isSelected()) { // 选中状态下
QPen pen(QBrush(Qt::black), 0.0f, Qt::DotLine);
painter->setPen(pen);
painter->drawPolygon(&pts[0], pts.count());
for(int i = 0; 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);
}
}
painter->restore();
}
void nmObjRectOutline::reorderPoints(QVector<QPointF>& points)
{
if(points.size() != 4) {
// 如果点的数量不是4个直接返回
return;
}
// 找到所有点的最小和最大坐标
double minX = points[0].x();
double maxX = points[0].x();
double minY = points[0].y();
double maxY = points[0].y();
for(int i = 1; i < 4; ++i) {
if(points[i].x() < minX) minX = points[i].x();
if(points[i].x() > maxX) maxX = points[i].x();
if(points[i].y() < minY) minY = points[i].y();
if(points[i].y() > maxY) maxY = points[i].y();
}
// 初始化四个角的点
QPointF leftTop, rightTop, rightBottom, leftBottom;
// 遍历点,确定每个点的位置
for(int i = 0; i < 4; ++i) {
const QPointF& pt = points[i];
if(pt.x() == minX && pt.y() == maxY) {
leftTop = pt; // 左上角
} else if(pt.x() == maxX && pt.y() == maxY) {
rightTop = pt; // 右上角
} else if(pt.x() == maxX && pt.y() == minY) {
rightBottom = pt; // 右下角
} else if(pt.x() == minX && pt.y() == minY) {
leftBottom = pt; // 左下角
}
}
// 按照左上角、右上角、右下角、左下角的顺序重新排列
points.clear();
points.push_back(leftTop);
points.push_back(rightTop);
points.push_back(rightBottom);
points.push_back(leftBottom);
}
// 上边界流动类型
void nmObjRectOutline::setTopOutlineFlowType(int newValue)
{
m_vFlowTypeList[0] = newValue;
emit sigOutlineFlowTypeChanged();
}
int nmObjRectOutline::getTopOutlineFlowType()
{
return m_vFlowTypeList[0];
}
// 右边界流动类型
void nmObjRectOutline::setRightOutlineFlowType(int newValue)
{
m_vFlowTypeList[1] = newValue;
emit sigOutlineFlowTypeChanged();
}
int nmObjRectOutline::getRightOutlineFlowType()
{
return m_vFlowTypeList[1];
}
// 下边界流动类型
void nmObjRectOutline::setBottomOutlineFlowType(int newValue)
{
m_vFlowTypeList[2] = newValue;
emit sigOutlineFlowTypeChanged();
}
int nmObjRectOutline::getBottomOutlineFlowType()
{
return m_vFlowTypeList[2];
}
// 左边界流动类型
void nmObjRectOutline::setLeftOutlineFlowType(int newValue)
{
m_vFlowTypeList[3] = newValue;
emit sigOutlineFlowTypeChanged();
}
int nmObjRectOutline::getLeftOutlineFlowType()
{
return m_vFlowTypeList[3];
}
void nmObjRectOutline::afterCreated()
{
// 矩形边界需要先对点排序,再交给 Binder 创建数据
reorderPoints(m_vecPoints);
if (m_pGraphicBinder) {
m_pGraphicBinder->createOutlineForGraphic(this);
}
}
void nmObjRectOutline::removeData()
{
if (m_pGraphicBinder) {
m_pGraphicBinder->removeOutlineBinding(this);
}
}