VC++开发GIS系统(191)线上删点之类的设计及实现

继续VC++开发GIS系统的工作,本文介绍的是一个新的功能:线上删点。效果如图:

功能分析

  1. 选择一条线
  2. 左键选中一个线节点
  3. 单击一个线节点,并调用 lineUpdate,实现删除点

类的定义

在_malaLines.h中定义线上删点的类,代码如下:

/*
*线上删点
*/
class malalinesdll CmalaLinesDeletePoint :public CmalaMouseAction
{
public:
    CmalaLinesDeletePoint(CView* mView, malaScreen *pScreen, CString &fileFullPath);
    virtual ~CmalaLinesDeletePoint();
    void LButtonDown(UINT nFlags, malaPoint point);
    void LButtonUp(UINT nFlags, malaPoint point);
    void MouseMove(UINT nFlags, malaPoint point);
private:
    bool m_Selected;
    vector<malaPoint>m_line;
    vector<malaPoint>m_perLine;
    malaLinePro m_linepro;
    CmalaLinesSelect m_SelectLine;
    bool callSel;//控制是否触发选择线

    int m_Pos;

    malaScreen *m_Screen;
    CString mPath;//文件路径
};
  • m_Selected 用来定义线是否被选中
  • m_line 记录选择的线
  • m_perLine 用于记录生成新线的变量
  • m_linepro 记录选择线的属性
  • m_SelectLine 一个选择线对象,用来选择线
  • callSel 控制是否触发选择线
  • m_Pos 记录点的序列位置
  • *m_Screen 屏幕坐标变换变量
  • mPath 文件路径

类的实现

在_malaLines.cpp中实现上述类,代码如下:

/*
* 线上删点实现
*/
CmalaLinesDeletePoint::CmalaLinesDeletePoint(CView* mView, malaScreen *pScreen, CString &fileFullPath)
{
    mBaseView = mView;
    mPath = fileFullPath;
    m_Screen = pScreen;
    CmalaLinesSelect obj(mView, pScreen, fileFullPath);
    m_SelectLine = obj;
    m_Selected = FALSE;
    callSel = FALSE;
    m_Pos = 0;
}

CmalaLinesDeletePoint::~CmalaLinesDeletePoint()
{
    if (m_line.size())
        m_line.clear();
    if (m_perLine.size())
        m_perLine.clear();
}

void CmalaLinesDeletePoint::LButtonDown(UINT nFlags, malaPoint point)
{
    if (!m_Selected&&!callSel)
        m_SelectLine.LButtonDown(nFlags, point);
    if (m_Selected&&!callSel)
    {
        malaLogic math;
        m_Pos = math.getPointPosInLine(point, m_line);
        if (m_Pos >= 0)
        {
            for (size_t i = 0; i < m_line.size(); i++)
            {
                if (i!=m_Pos)
                    m_perLine.push_back(m_line[i]); 
            }

            CLineIO lio;
            lio.lineUpdate(m_perLine, m_linepro, mPath);
            m_perLine.clear();
            m_line.clear();
            m_SelectLine.m_Selected = FALSE;
            mBaseView->Invalidate(TRUE);//+
            callSel = true;
        }
    }
}

void CmalaLinesDeletePoint::LButtonUp(UINT nFlags, malaPoint point)
{
    if (!m_Selected&&!callSel)
        m_SelectLine.LButtonUp(nFlags, point);

    m_Selected = m_SelectLine.m_Selected;
    if (m_Selected)
    {
        m_line = m_SelectLine.mLine;
        m_linepro = m_SelectLine.mLinePro;
    }
}

void CmalaLinesDeletePoint::MouseMove(UINT nFlags, malaPoint point)
{
    if (!m_Selected&&!callSel)
        m_SelectLine.MouseMove(nFlags, point);
}

主要的实现逻辑在 LButtonDown 函数中,

文中调用的 lineUpdate 函数可以参考文章《VC++开发GIS系统(173)移动线之更新一条线的属性函数定义及实现》。主要用来更新一条线的属性。

getPointPosInLine 函数可以参考文章《VC++开发GIS系统(188)线上移点之获取点在线的位置》,主要用于获取选中的点在线上的位置。

详细代码可以参考:GitHub

VC++开发GIS系统(190)线上移点之菜单响应 VC++开发GIS系统(192)线上删点之菜单响应

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论