`
rocye
  • 浏览: 120611 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

arcengine实现在SceneControl中画线

阅读更多

前两天好不容易搞好了Map与Scene的二三维联动,以为将二维中的线连动到三维中变成3D样式的管子很简单,又卡了。再一次狂乱的在Esri论坛上找答案,有这样的贴子提到如果用SceneControl加载一个sxd文件,然后在上面画线是可以的,便是如何才能让加载shp文件的SceneControl也能画线呢,有很多人都碰到过这个问题。上面有一个贴子结贴后最佳答案是这样说的:

直接 IGraphicsContainer3D gc3d = new GraphicsLayer3DClass(); 在gc3d上画就OK了。

 

但是说实话,对于新手的我,我真不知道看了这句话,我应该么样去改我的代码。下面贴出摘自网上的一段在SceneControl控件上监听mouseDown事件连续画线的代码,我在这上面纠结了很久。

 

 

private void axSceneControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ISceneControlEvents_OnMouseDownEvent e)
        {
            IPoint pt = null;
            ISceneGraph pSG = axSceneControl1.SceneGraph;
            ISceneViewer pSW = pSG.ActiveViewer;
            object a;
            object b;
            pSG.Locate(pSW, e.x, e.y, esriScenePickMode.esriScenePickAll, true, out pt, out a, out b);
            if (pt == null) return;
            ptCol.Add(pt);
            int i = ptCol.Count;
            if (i < 1) return;

            IRgbColor pRgbColor = new RgbColorClass();
            pRgbColor.Blue = 255;
            pRgbColor.Green = 0;
            pRgbColor.Red = 0;
            ISimpleLine3DSymbol pSimpleLine3DSymbol = new SimpleLine3DSymbolClass();
            pSimpleLine3DSymbol.Style = esriSimple3DLineStyle.esriS3DLSTube;
            ILineSymbol pLineSymbol = pSimpleLine3DSymbol as ILineSymbol;
            pLineSymbol.Color = pRgbColor;
            pLineSymbol.Width = 10;
            //ILineElement pLineElement = new LineElementClass();
            //pLineElement.Symbol = pLineSymbol;

            //产生线段对象 line
            ILine pLine = new LineClass();
            IPoint fromPt = ptCol[i - 1];
            IPoint toPt = ptCol[i - 2];
            pLine.PutCoords(fromPt, toPt);

            //将线段对象添加到多义线对象polyline
            object Missing1 = Type.Missing;
            object Missing2 = Type.Missing;
            ISegment pSegment = pLine as ISegment;
            m_polyline.AddSegment(pSegment, ref Missing1, ref Missing2);

            //让Z值生效
            IZAware Zaware = m_polyline as IZAware;
            Zaware.ZAware = true;

            IGeometry geometry = (IGeometry)m_polyline;

            //更新到Graphics窗口
            IGraphicsContainer3D pGCon3D = axSceneControl1.Scene.BasicGraphicsLayer as IGraphicsContainer3D;
            IElement pElement = new LineElementClass();
            pElement.Geometry = geometry;

            ILineElement pLineElement = pElement as ILineElement;
            pLineElement.Symbol = pLineSymbol;

            pGCon3D.DeleteAllElements();
            pGCon3D.AddElement(pElement);
            axSceneControl1.Scene.SceneGraph.RefreshViewers();
        }

 

 是的,这段代码如果 axSceneControl1 加载的是.sxd文件确实可以画。且是画出的就是管子样式的线。那么么样改一下就能让加载.shp文件的axSceneControl1 也可以画呢。看代码:

 

 

public Form1()
        {
            InitializeComponent();

            _axesGraphicsContainer3D = new GraphicsLayer3DClass();
            ILayer layer = _axesGraphicsContainer3D as ILayer;
            layer.Name = "XXX";

            this.axSceneControl1.Scene.AddLayer(_axesGraphicsContainer3D as ILayer, true);
        }


private void axSceneControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ISceneControlEvents_OnMouseDownEvent e)
        {
            IPoint pt = null;
            ISceneGraph pSG = axSceneControl1.SceneGraph;
            ISceneViewer pSW = pSG.ActiveViewer;
            object a;
            object b;
            pSG.Locate(pSW, e.x, e.y, esriScenePickMode.esriScenePickAll, true, out pt, out a, out b);
            if (pt == null) return;
            ptCol.Add(pt);
            int i = ptCol.Count;
            if (i < 1) return;

            IRgbColor pRgbColor = new RgbColorClass();
            pRgbColor.Blue = 255;
            pRgbColor.Green = 0;
            pRgbColor.Red = 0;
            ISimpleLine3DSymbol pSimpleLine3DSymbol = new SimpleLine3DSymbolClass();
            pSimpleLine3DSymbol.Style = esriSimple3DLineStyle.esriS3DLSTube;
            ILineSymbol pLineSymbol = pSimpleLine3DSymbol as ILineSymbol;
            pLineSymbol.Color = pRgbColor;
            pLineSymbol.Width = 10;
            //ILineElement pLineElement = new LineElementClass();
            //pLineElement.Symbol = pLineSymbol;

            //产生线段对象 line
            ILine pLine = new LineClass();
            IPoint fromPt = ptCol[i - 1];
            IPoint toPt = ptCol[i - 2];
            pLine.PutCoords(fromPt, toPt);

            //将线段对象添加到多义线对象polyline
            object Missing1 = Type.Missing;
            object Missing2 = Type.Missing;
            ISegment pSegment = pLine as ISegment;
            m_polyline.AddSegment(pSegment, ref Missing1, ref Missing2);

            //让Z值生效
            IZAware Zaware = m_polyline as IZAware;
            Zaware.ZAware = true;

            IGeometry geometry = (IGeometry)m_polyline;

            //更新到Graphics窗口
    IGraphicsContainer3D pGCon3D = this._axesGraphicsContainer3D; //这一行代码要改 IGraphicsContainer3D pGCon3D = axSceneControl1.Scene.BasicGraphicsLayer as IGraphicsContainer3D;
            IElement pElement = new LineElementClass();
            pElement.Geometry = geometry;

            ILineElement pLineElement = pElement as ILineElement;
            pLineElement.Symbol = pLineSymbol;

            pGCon3D.DeleteAllElements();
            pGCon3D.AddElement(pElement);
            axSceneControl1.Scene.SceneGraph.RefreshViewers();
        }
 

 

O了,这样,你用SceneControl加载一个中国地图的shp文件进来,再在上面点击鼠标几下试下,就能看到效果了。

分享到:
评论
1 楼 陈不二 2014-11-27  
IGraphicsContainer3D gc3d = new GraphicsLayer3DClass();
需要强制转换吗?楼主大神也你的代码
            _axesGraphicsContainer3D = new GraphicsLayer3DClass();
中也没有注明_axesGraphicsContainer3D的类型

相关推荐

    SceneControl中画线

    总结来说,要在ArcEngine的SceneControl中画线,你需要创建GraphicsLayer3D对象,监听鼠标事件,处理几何对象,设置线的样式,以及管理GraphicsContainer3D。通过这些步骤,你可以创建出交互式的三维地理信息系统,...

    ArcEngine三维开发

    在IT行业中,ArcEngine是一款由Esri公司推出的强大的地理信息系统(GIS)开发平台,它提供了丰富的API和工具,使得开发者能够构建自己的桌面、Web以及移动应用程序,尤其在三维GIS领域有着广泛的应用。本文将深入...

    ArcScene+AE+点击画线.pdf

    AE在这里可能指的是ArcEngine,它是Esri提供的一组开发工具,旨在为开发人员提供强大的GIS功能。ArcEngine包括一系列组件和服务,可以集成到不同的应用程序中,从而实现地图展示、空间分析等功能。在本案例中,AE与...

    C#三维开发基本功能实现的源程序

    在C#编程环境中,进行三维开发是一项复杂而有趣的工作,特别是在使用AE(ArcEngine)这样的专业GIS开发平台时。这个压缩包" C#三维开发基本功能实现的源程序"提供了在scenecontrol中进行三维场景操作的关键代码和...

    3 Android SqliteManager 源码.zip

    3 Android SqliteManager 源码.zip

    基于S7-200 PLC的煤矿排水系统智能控制:三台水泵联动与备援策略

    内容概要:本文详细介绍了基于S7-200 PLC的煤矿排水系统智能控制方案,重点讨论了三台水泵(两台工作水泵和一台备用水泵)的联动与备援策略。系统通过超声波液位传感器实时监测水位,根据不同水位情况自动控制水泵的启停。具体而言,水位低时不启动水泵,水位介于中水位和高水位之间时启动1号水泵,水位超过高水位则启动1号和2号水泵共同工作。若1号或2号水泵出现故障,系统会自动启用3号备用水泵。此外,MCGS6.2组态画面用于实时监控水位和水泵状态,帮助操作员及时应对异常情况,确保矿井安全。 适合人群:从事煤矿自动化控制领域的技术人员、矿业工程管理人员及相关研究人员。 使用场景及目标:适用于需要提高煤矿排水系统自动化水平的场合,旨在提升矿井排水效率和安全性,减少人工干预,确保矿井生产安全。 其他说明:文中提到的技术方案不仅提高了排水系统的可靠性,还为未来的智能化矿山建设提供了有益借鉴。

    scratch少儿编程逻辑思维游戏源码-灌篮之王.zip

    scratch少儿编程逻辑思维游戏源码-灌篮之王.zip

    scratch少儿编程逻辑思维游戏源码-飞翔马里奥(2).zip

    scratch少儿编程逻辑思维游戏源码-飞翔马里奥(2).zip

    scratch少儿编程逻辑思维游戏源码-火柴人大战 中世纪战争.zip

    scratch少儿编程逻辑思维游戏源码-火柴人大战 中世纪战争.zip

    scratch少儿编程逻辑思维游戏源码-几何冲刺(2).zip

    scratch少儿编程逻辑思维游戏源码-几何冲刺(2).zip

    南京证券-低轨卫星互联网启动,天地一体通信迈向6G.pdf

    南京证券-低轨卫星互联网启动,天地一体通信迈向6G

    nginx-1.20.1

    nginx-1.20.1

    sshpass-1.06-8.ky10.aarch

    sshpass-1.06-8.ky10.aarch

    少儿编程scratch项目源代码文件案例素材-我的世界2D(更新北极).zip

    少儿编程scratch项目源代码文件案例素材-我的世界2D(更新北极).zip

    通信行业专题研究:车载全息数字人——AI+Agent新场景,全息投影新方向-20231121-国盛证券-13页.pdf

    通信行业专题研究:车载全息数字人——AI+Agent新场景,全息投影新方向-20231121-国盛证券-13页

    基于S7-200 PLC与组态王的邮件分拣系统设计——智能化控制技术与实践应用研究

    内容概要:本文详细介绍了利用西门子S7-200 PLC和组态王软件构建的邮件分拣系统的具体设计方案和技术细节。首先,文中阐述了硬件部分的设计,包括光电传感器、传送带电机以及分拣机械臂的连接方式,特别是旋转编码器用于精确测量包裹位移的技术要点。接着,展示了PLC编程中的关键代码段,如初始化分拣计数器、读取编码器数据并进行位置跟踪等。然后,描述了组态王作为上位机软件的作用,它不仅提供了直观的人机交互界面,还允许通过简单的下拉菜单选择不同的分拣规则(按省份、按重量或加急件)。此外,针对可能出现的通信问题提出了有效的解决方案,比如采用心跳包机制确保稳定的数据传输,并解决了因电磁干扰导致的问题。最后,分享了一些现场调试的经验教训,例如为减少编码器安装误差对分拣精度的影响而引入的位移补偿算法。 适合人群:从事自动化控制领域的工程师或者对此感兴趣的初学者。 使用场景及目标:适用于需要提高邮件或其他物品自动分拣效率的企业或机构,旨在降低人工成本、提升工作效率和准确性。 其他说明:文中提到的实际案例表明,经过优化后的系统能够显著改善分拣性能,将分拣错误率大幅降至0.3%,并且日均处理量可达2万件包裹。

    scratch少儿编程逻辑思维游戏源码-机械汽车.zip

    scratch少儿编程逻辑思维游戏源码-机械汽车.zip

    光学领域:基于束缚态驱动的手征超表面实现可调谐手征光学响应的研究及其应用

    内容概要:本文详细探讨了在连续介质中利用束缚态驱动设计并实现具有最大和可调谐手征光学响应的平面手征超表面的方法。文中首先介绍了comsol三次谐波和本征手性BIC(束缚态诱导的透明)两种重要光学现象,随后阐述了具体的手征超表面结构设计,包括远场偏振图、手性透射曲线、二维能带图、Q因子图和电场图的分析。最后,通过大子刊nc复现实验验证了设计方案的有效性,并对未来的研究方向进行了展望。 适合人群:从事光学研究的专业人士、高校物理系师生、对光与物质相互作用感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解手征超表面设计原理及其光学响应机制的研究人员,旨在推动新型光学器件的研发和技术进步。 其他说明:本文不仅展示了理论分析和模拟计算,还通过实验证明了设计方法的可行性,为后续研究奠定了坚实的基础。

    少儿编程scratch项目源代码文件案例素材-位图冒险.zip

    少儿编程scratch项目源代码文件案例素材-位图冒险.zip

    少儿编程scratch项目源代码文件案例素材-校园困境2.zip

    少儿编程scratch项目源代码文件案例素材-校园困境2.zip

Global site tag (gtag.js) - Google Analytics