实现前后视图的C#代码

这篇博客介绍了一种用C#实现前后视图切换的方法。通过维护两个视图数据集合,`PreviousViews`存储前视图,`NextViews`存储后视图。在地图刷新后,检查当前视图是否与前视图不同,不同则更新视图数据。`ZoomPrevious`和`ZoomNext`方法分别用于切换到前一视图和后一视图。当视图数量超过预设限制时,会移除最旧的视图数据。
//实现:

//        视图数据以soPoint3D表示,x表示中心点X,y表示中心点Y,z表示ViewScale。

//        前视图数据和后视图数据以soPoint3Ds表示。

//        每次地图刷新(smoMap_AfterMapDraw)之后,检查当前视图与前视图数据 PreviousViews 的最后一个视图数据是否一致,不一致时添加到前视图数据,并清空后视图数据。

//        返回前视图:ZoomPrevious,返回后视图:ZoomNext。





        /// <summary>

        /// 前视图数据。

        /// </summary>

        private soPoint3Ds PreviousViews = new soPoint3Ds();



        /// <summary>

        /// 后视图数据。

        /// </summary>

        private soPoint3Ds NextViews = new soPoint3Ds();





        /// <summary>

        /// 前一窗口。

        /// </summary>

        private void ZoomPrevious()

        {

            // 检查是否有前视图数据。

            int nViewCount = PreviousViews.Count;

            if (nViewCount < 2)

            {

                System.Console.Beep();

                return;

            }



            // 当前视图添加到后视图数据中。

            soPoint3D pt = PreviousViews[nViewCount];

            NextViews.Add(pt);

            Marshal.ReleaseComObject(pt);

            pt = null;

            PreviousViews.Remove(nViewCount, 1);



            // 设置前一视图为当前视图。

            pt = PreviousViews[nViewCount - 1];

            smoMap.CenterX = pt.x;

            smoMap.CenterY = pt.y;

            smoMap.ViewScale = pt.z;

            Marshal.ReleaseComObject(pt);

            pt = null;



            smoMap.**();

        }



        /// <summary>

        /// 后一窗口。

        /// </summary>

        private void ZoomNext()

        {

            // 检查是否有后视图数据。

            int nViewCount = NextViews.Count;

            if (nViewCount < 1)

            {

                System.Console.Beep();

                return;

            }



            // 当后一视图添加到前视图数据中,

            // 并设置为当前视图。

            soPoint3D pt = NextViews[nViewCount];

            NextViews.Remove(nViewCount, 1);

            PreviousViews.Add(pt);

            smoMap.CenterX = pt.x;

            smoMap.CenterY = pt.y;

            smoMap.ViewScale = pt.z;

            Marshal.ReleaseComObject(pt);

            pt = null;



            smoMap.**();

        }



        private void FormMap_FormClosed(object sender, FormClosedEventArgs e)

        {

            if (smoMap != null)

            {

                smoMap.Close();

                smoMap.Disconnect();

                smoMap = null;

            }



            PreviousViews.RemoveAll();

            Marshal.ReleaseComObject(PreviousViews);

            PreviousViews = null;

            NextViews.RemoveAll();

            Marshal.ReleaseComObject(NextViews);

            NextViews = null;

        }



        private void smoMap_AfterMapDraw(object sender, _DSuperMapEvents_AfterMapDrawEvent e)

        {

            // 当前视图数据。

            soPoint3D ptNow = new soPoint3D();

            ptNow.x = smoMap.CenterX;

            ptNow.y = smoMap.CenterY;

            ptNow.z = smoMap.ViewScale;



            // 如果没有前视图数据,

            // 或者前一视图数据与当前视图数据不一致时,

            // 添加当前视图数据到前视图数据。

            int nViewCount = PreviousViews.Count;

            bool bAdd = false;



            if (nViewCount == 0)

            {

                bAdd = true;

            }

            else

            {

                soPoint3D ptPrev = PreviousViews[nViewCount];

                // 平面距离大于模糊容限或者比例尺分母不相同时需要添加。

                bAdd = EdcjGlobalVar.TOLERANCEFUZZY < Math.Sqrt(Math.Pow(ptPrev.x - ptNow.x, 2) + Math.Pow(ptPrev.y - ptNow.y, 2))

                    || Math.Floor(1.0 / ptNow.z) != Math.Floor((1.0 / ptPrev.z));

                Marshal.ReleaseComObject(ptPrev);

                ptPrev = null;

            }



            if (bAdd)

            {

                if (nViewCount > EdcjGlobalVar.ZOOMCOUNTLIMITATION)

                {

                    PreviousViews.Remove(1, 1);

                }

                PreviousViews.Add(ptNow);

                NextViews.RemoveAll();

            }

            Marshal.ReleaseComObject(ptNow);

            ptNow = null;

        }



//其中

// double EdcjGlobalVar.TOLERANCEFUZZY 保存顶点/节点之间的模糊容限。小于此值的两点认为是重合的,默认值0.001。

// int EdcjGlobalVar.ZOOMCOUNTLIMITATION 保存前后视图的最多的个数,默认值200.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值