首页 / 浏览问题 / 组件GIS / 问题详情
超图二次开发:想在三维场景中建立一个点对象,并且选中该点对象时弹出气泡。
4月27

您好。我想在超图的三维场景(scene)中添加一个点,然后这个点有着他的属性。

但是我用如下代码添加后在三维场景中看不到这点,仅能再这个点附近看到 geotext。

并且我想要点击选中这个点(自动捕捉这个点)的时候弹出一个气泡。现在的情况是刚在三维场景中添加这个点的时候有气泡,关掉了气泡就不能再弹出来了。

大佬们有什么解决的方法吗?

public void AddPointToScence(Point3D p3d)
        {
            GeoPoint3D geoPoint3D = new GeoPoint3D(p3d);
            geoPoint3D.Position = p3d;

            // 添加图标在3维图上
            GeoStyle3D geoStyle3D = new GeoStyle3D();
            geoStyle3D.MarkerFile = Directory.GetCurrentDirectory() +
                "\\icons\\" + "平硐" + ".png";
            //标记大小
            geoStyle3D.MarkerScale = 1.0;
            geoStyle3D.MarkerAnchorPoint = new Point2D(0.5, 0);
            geoStyle3D.AltitudeMode = AltitudeMode.Absolute;
            geoPoint3D.Style3D = geoStyle3D;
            mSceneControl.Scene.TrackingLayer.Add(geoPoint3D, "平硐");//向三维跟踪图层中添加一个对象。

            // 添加文字标签,写在三维图上
            string text = tb_GK_adit_no.Text.ToString();
            TextPart textpart = new TextPart(text, mP3D.X, mP3D.Y, mP3D.Z);
            GeoText geoText = new GeoText(textpart);
            geoText.TextStyle.ForeColor = System.Drawing.Color.Red;
            geoText.TextStyle.BackColor = System.Drawing.Color.AliceBlue;
            geoText.TextStyle.Shadow = true;
            geoText.TextStyle.ShadowColor = System.Drawing.Color.AliceBlue;
            geoText.TextStyle.Bold = true;
            mSceneControl.Scene.TrackingLayer.Add(geoText, text);
         

            // 将气泡控件添加到SceneControl中
            mSceneControl.Controls.Add(bubbleControl);

            Bubble bubble = new Bubble();
            //选择不同的地物弹出不同的气泡
            
            bubble.ClientWidth = bubbleControl.Width;
            bubble.ClientHeight = bubbleControl.Height;
            bubble.Pointer = p3d;
            bubbleControl.Location = new System.Drawing.Point(bubble.ClientLeft, bubble.ClientTop);
            mSceneControl.Bubbles.Add(bubble);
            mSceneControl.Scene.Refresh();

            // 注册气泡初始化的事件
            mSceneControl.BubbleInitialize += new BubbleInitializeEventHandler(m_sceneControl_BubbleInitialize);

            // 注册气泡位置变化的事件
            mSceneControl.BubbleResize += new BubbleResizeEventHandler(m_sceneControl_BubbleResize);

            // 注册关闭气泡的事件
            mSceneControl.BubbleClose += new BubbleCloseEventHandler(m_sceneControl_BubbleClose);


        }

image

1个回答

您好,SuperMap iDesktop 安装目录\SampleCode\CustomContextMenuItem 项目示例代码与您描述的功能一致,建议您可以参考这个示例代码进行您的二次开发。该示例代码的气泡使用功能是正常的,具体使用方法如下:

示例代码中不仅注册了您代码中的3个气泡事件,还注册了其他响应事件,如下:

特别是 ObjectSelected 事件,建议您参考其逻辑对您的代码进行调整。

希望可以帮到您。

刘程贤  (918EXP)  才高八斗
4月27

我现在注册了ObjectSelected 事件,但是我在场景中点了一个几何对象后,发现获取场景中的选择集数组不为空,但是选择集个数为0,导致无法对其进行下一步操作。这是怎么回事?请大佬帮助。

// 选中几何对象弹出气泡,仍然有问题
        void m_sceneControl_ObjectSelected(object sender, ObjectSelectedEventArgs e)
        {
            Console.WriteLine("选中。 ");
            Recordset recordset = null;
            try
            {
                if (mSceneControl.Bubbles.Count > 0)
                {
                    mSceneControl.Bubbles.Clear();
                }

                if (mSceneControl.Scene.FindSelection(true) != null)
                {
                    ///目前问题是选择集数组不为空,但是选择集个数为0
                    int n = mSceneControl.Scene.FindSelection(true).Count();//n=0????
                    Selection3D[] selections = mSceneControl.Scene.FindSelection(true);
                    // 获取当前场景中的选择集数组中第一个选择集对象
                    m_selection = mSceneControl.Scene.FindSelection(true)[0];//出现异常


                    // 将三维选择对象转化为记录集
                    recordset = m_selection.ToRecordset();
                    //Bubble bubble = null;
                    /bble = new Bubble();
                    mSceneControl.Bubbles.Add(bubble);
                    bubble.ClientWidth = bubbleControl.Width;
                    bubble.ClientHeight = bubbleControl.Height;
                    bubbleControl.Location = new System.Drawing.Point(bubble.ClientLeft, bubble.ClientTop);
                    mSceneControl.Scene.Refresh();

                    // 获取当前记录集对应的几何对象
                    Geometry3D geometry3D = recordset.GetGeometry() as Geometry3D;
                    // 获取当前几何对象包围盒的中心点
                    Point3D point3D = geometry3D.BoundingBox.Center;
                    // 气泡指向该中心点
                    bubble.Pointer = point3D;

                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.Message);
            }
            finally
            {
                if (recordset != null)
                {
                    recordset.Close();
                    recordset.Dispose();
                }
            }
        }

image

您好,请问您使用的是哪个测试数据呢?建议您先用 iDesktop 安装目录\SampleData\3D\CBDDataset 测试数据试试能否正常获取选中的数据集。或者先直接运行 iDesktop 安装目录\SampleCode\CustomContextMenuItem 项目,调试看看能否正常获取选中的数据集。

我本机使用您的测试代码,使用 CBDDataset 的测试数据,情况如下:

...