使用产品:SuperMap Objects .NET 6R,VS2019,操作系统:win10 64位。
问题详细描述:在实现《SuperMap GIS二三维一体化开发实战》一书P265-269的地下三维场景操作功能中,有一个小的功能“绘制多边形时实时显示地表开挖面积”这里的代码有一行报错。按照书上代码敲到VS平台中,运行程序,加载SuperMap Objects .NET 6R自带的数据BeijingDEM.smwu中的CAD数据集Underground到程序中显示出来。然后,点击工具栏中的开启地下模式,单击“地表开挖”按钮,鼠标应该能在三维场景中绘制多边形,但只要鼠标一点,就报错,loction = geometry.InnerPoint3D;这句代码报错,显示System.NullReferenceException:“未将对象引用设置到对象的实例。”我把void m_sceneControl_Tracking(object sender, Tracking3DEventArgs e)这个“绘制多边形时实时显示挖方面积”这一大段代码变成注释,里面包含loction = geometry.InnerPoint3D这句代码。然后运行程序,就能够正常绘制多边形,只是不能实时显示开挖面积,说明注释的这一大段代码与绘制多边形无关,用来显示开挖面积,但是搞不清楚为什么按照书上代码一样的敲,会报错。
绘制多边形时实时显示地表开挖面积
void m_sceneControl_Tracking(object sender, Tracking3DEventArgs e)
{
try
{
Point3D loction = new Point3D(0, 0, 0);
// 获取当前正在绘制的三维几何对象
Geometry3D geometry = e.Geometry;
//GeoRegion3D geoRegion3D = e.Geometry as GeoRegion3D;
Point3D point3D = new Point3D(e.X, e.Y, e.CurrentHeight);
point3D.Z = m_sceneControl.Scene.GetAltitude(e.X, e.Y);
Point point = m_sceneControl.Scene.GlobeToPixel(point3D);
Int32 index = m_sceneControl.Scene.TrackingLayer.IndexOf("area");
String text = String.Empty;
if (m_sceneControl.Action == Action3D.MeasureArea)
{
if (index != -1)
{
m_sceneControl.Scene.TrackingLayer.Remove(index);
}
text = String.Format("{0}{1}{2}", m_area, e.TotalArea, m_squareMeter);
loction = geometry.InnerPoint3D; 出错代码是这一句。
//loction = geoRegion3D.InnerPoint3D;
GeoText3D geoText = new GeoText3D(new TextPart3D(text, loction));
m_sceneControl.Scene.TrackingLayer.Add(geoText, "area");
}
else
{
return;
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}