博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在SceneControl中交互绘制点和线,通过GraphicLayer3D显示
阅读量:5946 次
发布时间:2019-06-19

本文共 9648 字,大约阅读时间需要 32 分钟。

原创文章,转载请注明出处!

这两天实现了一个在SceneControl中交互绘制点和线,通过GraphicLayer3D显示的类,分享一下!

public IRay ICamera.GetIdentifyVector(int x,int y)得到了射线后,可以根据我想要的点的z值(或x值或y值)推算出另外两个坐标值,从而确定该点。

自己定义了一个IBaseHeight的接口,用于设定鼠标点击产生点的基准高程!按照这种思路完全可以开发更加复杂的图形绘制!

View Code
1  [Guid("971a527b-d128-4248-aa84-918c8bd08499")]   2     [ClassInterface(ClassInterfaceType.None)]   3     [ProgId("DrawProfile.DrawLine3Tool")]   4     public sealed class DrawLine3Tool : BaseTool,IBaseHeight   5     {
6 #region COM Registration Function(s) 7 [ComRegisterFunction()] 8 [ComVisible(false)] 9 static void RegisterFunction(Type registerType) 10 {
11 // Required for ArcGIS Component Category Registrar support 12 ArcGISCategoryRegistration(registerType); 13 14 // 15 // TODO: Add any COM registration code here 16 // 17 } 18 19 [ComUnregisterFunction()] 20 [ComVisible(false)] 21 static void UnregisterFunction(Type registerType) 22 {
23 // Required for ArcGIS Component Category Registrar support 24 ArcGISCategoryUnregistration(registerType); 25 26 // 27 // TODO: Add any COM unregistration code here 28 // 29 } 30 31 #region ArcGIS Component Category Registrar generated code 32 /// 33 /// Required method for ArcGIS Component Category registration - 34 /// Do not modify the contents of this method with the code editor. 35 /// 36 private static void ArcGISCategoryRegistration(Type registerType) 37 {
38 string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{
{
{0}}}", registerType.GUID); 39 SxCommands.Register(regKey); 40 ControlsCommands.Register(regKey); 41 } 42 /// 43 /// Required method for ArcGIS Component Category unregistration - 44 /// Do not modify the contents of this method with the code editor. 45 /// 46 private static void ArcGISCategoryUnregistration(Type registerType) 47 {
48 string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{
{
{0}}}", registerType.GUID); 49 SxCommands.Unregister(regKey); 50 ControlsCommands.Unregister(regKey); 51 } 52 53 #endregion 54 #endregion 55 56 private ISceneHookHelper m_sceneHookHelper = null; 57 private static IGraphicsContainer3D m_graphicsContainer3D = null; 58 double m_height = 0; 59 60 public double Height 61 {
62 get { return m_height; } 63 set { m_height = value; } 64 } 65 public DrawLine3Tool() 66 {
67 // 68 // TODO: Define values for the public properties 69 // 70 base.m_category = "绘制3D线"; //localizable text 71 base.m_caption = "DrawLine3Tool"; //localizable text 72 base.m_message = "This should work in ArcScene/SceneControl"; //localizable text 73 base.m_toolTip = "DrawLine3Tool"; //localizable text 74 base.m_name = "DrawLine3Tool"; //unique id, non-localizable (e.g. "MyCategory_MyTool") 75 try 76 {
77 // 78 // TODO: change resource name if necessary 79 // 80 string bitmapResourceName = GetType().Name + ".bmp"; 81 base.m_bitmap = new Bitmap(GetType(), bitmapResourceName); 82 base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur"); 83 84 } 85 catch (Exception ex) 86 {
87 System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap"); 88 } 89 } 90 91 #region Overriden Class Methods 92 93 /// 94 /// Occurs when this tool is created 95 /// 96 /// Instance of the application 97 public override void OnCreate(object hook) 98 {
99 try 100 {
101 m_sceneHookHelper = new SceneHookHelperClass(); 102 m_sceneHookHelper.Hook = hook; 103 if (m_sceneHookHelper.ActiveViewer == null) 104 {
105 m_sceneHookHelper = null; 106 } 107 } 108 catch 109 {
110 m_sceneHookHelper = null; 111 } 112 113 if (m_sceneHookHelper == null) 114 base.m_enabled = false; 115 else 116 base.m_enabled = true; 117 118 // TODO: Add other initialization code 119 } 120 121 /// 122 /// Occurs when this tool is clicked 123 /// 124 public override void OnClick() 125 {
126 if (m_graphicsContainer3D == null) 127 {
128 m_graphicsContainer3D = new GraphicsLayer3DClass(); 129 ILayer layer = m_graphicsContainer3D as ILayer; 130 layer.Name = "绘制"; 131 m_sceneHookHelper.Scene.AddLayer(layer, true); 132 } 133 // TODO: Add DrawLine3Tool.OnClick implementation 134 } 135 IPointCollection m_ptCol = null; 136 IElement pLineElement = null; 137 int i = 0; 138 public override void OnMouseDown(int Button, int Shift, int X, int Y) 139 {
140 if (Button==1) 141 {
142 double ValueZ = m_height;//假设所单击的点的坐标的Z值为0 143 ICamera pCamara = m_sceneHookHelper.Camera; 144 IRay pRay = pCamara.GetIdentifyRay(X, Y); 145 IVector3D pVecotor3D = pRay.Vector; 146 pVecotor3D.Normalize(); 147 double a = (ValueZ - pRay.Origin.Z) / pVecotor3D.ZComponent; 148 IPoint Pnt = new PointClass(); 149 Pnt.Z = ValueZ; 150 Pnt.X = pRay.Origin.X + pVecotor3D.XComponent * a; 151 Pnt.Y = pRay.Origin.Y + pVecotor3D.YComponent * a; 152 153 (Pnt as IZAware).ZAware = true; 154 155 IElement pElement = new MarkerElementClass(); 156 IRgbColor pColor = new RgbColorClass(); 157 pColor.Red = 255; 158 //ISimpleMarkerSymbol pMarkerSymbol = new SimpleMarkerSymbolClass(); 159 //pMarkerSymbol.Size = 30; 160 //pMarkerSymbol.Color = pColor; 161 //(pElement as IMarkerElement).Symbol = pMarkerSymbol; 162 //pElement.Geometry = Pnt; 163 //pGC3D.AddElement(pElement); 164 //this.axSceneControl1.Scene.SceneGraph.RefreshViewers(); 165 166 IMarkerSymbol pMarkerSymbol = new SimpleMarker3DSymbolClass(); 167 ((ISimpleMarker3DSymbol)pMarkerSymbol).Style = esriSimple3DMarkerStyle.esriS3DMSSphere; 168 ((ISimpleMarker3DSymbol)pMarkerSymbol).ResolutionQuality = 1.0; 169 170 pMarkerSymbol.Size = 100; 171 pMarkerSymbol.Color = pColor; 172 //IElement pElement = new MarkerElementClass(); 173 ((IMarkerElement)pElement).Symbol = pMarkerSymbol; 174 175 pElement.Geometry = Pnt; 176 m_graphicsContainer3D.AddElement(pElement); 177 object Missing1 = Type.Missing; 178 i++; 179 if (i < 2) 180 {
181 m_ptCol = new PolylineClass(); 182 pLineElement = new LineElementClass(); 183 m_ptCol.AddPoint(Pnt, ref Missing1, ref Missing1); 184 } 185 else 186 { 187 m_ptCol.AddPoint(Pnt, ref Missing1, ref Missing1); 188 IPolyline pPolyline = m_ptCol as IPolyline; 189 IGeometry geometry = (IGeometry)pPolyline; 190 pLineElement.Geometry = geometry; 191 m_graphicsContainer3D.AddElement(pLineElement); 192 } 193 194 } 195 else if (Button==2) 196 {
197 IPolyline pPolyline = m_ptCol as IPolyline; 198 //让Z值生效 199 IZAware Zaware = pPolyline as IZAware; 200 Zaware.ZAware = true; 201 IGeometry geometry = (IGeometry)pPolyline; 202 203 //更新到Graphics窗口 204 pLineElement.Geometry = geometry; 205 m_graphicsContainer3D.AddElement(pLineElement); 206 IGraphicsSelection pSelection = m_graphicsContainer3D as IGraphicsSelection; 207 pSelection.UnselectAllElements(); 208 pSelection.SelectElement(pLineElement); 209 m_ptCol = null; 210 i = 0; 211 } 212 m_sceneHookHelper.ActiveViewer.SceneGraph.RefreshViewers(); 213 214 } 215 216 public override void OnMouseMove(int Button, int Shift, int X, int Y) 217 {
218 // TODO: Add DrawLine3Tool.OnMouseMove implementation 219 } 220 221 public override void OnMouseUp(int Button, int Shift, int X, int Y) 222 {
223 // TODO: Add DrawLine3Tool.OnMouseUp implementation 224 } 225 #endregion 226 } 227 interface IBaseHeight 228 {
229 double Height { get; set; } 230 }

参考文章:,感谢sunqunsunqun

转载于:https://www.cnblogs.com/yhlx125/archive/2011/12/29/2305800.html

你可能感兴趣的文章
nginc+memcache
查看>>
php正则匹配utf-8编码的中文汉字
查看>>
MemCache在Windows环境下的搭建及启动
查看>>
linux下crontab实现定时服务详解
查看>>
Numpy中的random模块中的seed方法的作用
查看>>
用java数组模拟登录和注册功能
查看>>
javaScript实现归并排序
查看>>
关于jsb中js与c++的相互调用
查看>>
UVA 122 Trees on the level 二叉树 广搜
查看>>
POJ-2251 Dungeon Master
查看>>
tortoisesvn的安装
查看>>
我是怎么使用最短路径算法解决动态联动问题的
查看>>
URAL 1353 Milliard Vasya's Function DP
查看>>
速读《构建之法:现代软件工程》提问
查看>>
Android onclicklistener中使用外部类变量时为什么需要final修饰【转】
查看>>
django中聚合aggregate和annotate GROUP BY的使用方法
查看>>
TFS简介
查看>>
docker管理平台 shipyard安装
查看>>
安装django
查看>>
Bootstrap3 栅格系统-简介
查看>>