//实现:
// 视图数据以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.
实现前后视图的C#代码
最新推荐文章于 2020-12-14 16:27:51 发布
这篇博客介绍了一种用C#实现前后视图切换的方法。通过维护两个视图数据集合,`PreviousViews`存储前视图,`NextViews`存储后视图。在地图刷新后,检查当前视图是否与前视图不同,不同则更新视图数据。`ZoomPrevious`和`ZoomNext`方法分别用于切换到前一视图和后一视图。当视图数量超过预设限制时,会移除最旧的视图数据。
1061

被折叠的 条评论
为什么被折叠?



