首页 / 浏览问题 / 组件GIS / 问题详情
错误“未将对象引用设置到对象的实例。”怎么解决
2EXP 2022年03月18日
使用产品: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);
            }
        }

1个回答

您好,SuperMap iObjects .NET 6R产品已经在2016年9月下线,不再提供技术支持,建议您在http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx下载最新版SuperMap iObjects .NET 10i版本使用。

在SuperMap iObjects .NET 10i安装目录下有离线帮助文档和示例代码,建议您可以参考文档进行编码。

希望可以帮到您。

2,163EXP 2022年03月18日
...