Arcscene二次开发部分开发C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Analyst3D;
using ESRI.ArcGIS.Animation;
using ESRI.ArcGIS.DataSourcesRaster;
using stdole;
using System.Text.RegularExpressions;
namespace ESRI项目开发竞赛
{
public partial class FrcSence : Form
{
public FrcSence()
{
InitializeComponent();
}
#region //全局变量
public Boolean scenePan = false;
public int clickSceneTime = 0;
public IPoint scenePanPoints1 = new PointClass();
public IPoint scenePanPoints2 = new PointClass();
public IPoint CameraObs = new PointClass();
public IAnimationTrack Playtrl = new AnimationTrackClass();
public Boolean CreaterKeyFrameSwitch = false;
public int KeyIndex;
//public AxSceneControl paxSceneControl;
public double startHeight;
public double endHeight;
public double nowHeight;
//private ILegendClass pLegendClass;
//private ILayer pLayer;
public ISymbol pSymbol;
public Image pSymbolImage;
//private bool p;
private ILayer TOCRightLayer;
public ISceneControl mSceneControl;
//FrmIdentify pFrmIdentify = new FrmIdentify();
public Boolean pIdnetifyIsOrNot;
//public IScene pScene;
#endregion
#region //菜单功能
/// <summary>
/// 打开Raster文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 打开Raster文件ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
openFileDialog1 = new OpenFileDialog();
openFileDialog1.Title = "添加raster数据";
openFileDialog1.Filter = "TIFF格式(*.tif)|*.tif|Img格式(*.img)|*.img|Bmp格式(*.bmp)|*.bmp|Jpeg格式(*.jpg)|*.jpg";
openFileDialog1.ShowDialog();
string sFilePath = openFileDialog1.FileName;
IRasterLayer pRaster;
pRaster = new RasterLayerClass();
pRaster.CreateFromFilePath(sFilePath);
axSceneControl1.Scene.AddLayer(pRaster, true);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
/// <summary>
/// 打开Feature文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 打开Feature文件ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog pOpenfile = new OpenFileDialog();
pOpenfile.Title = "添加shapefile文件";
pOpenfile.Filter = "*(.shp)|*.shp";
pOpenfile.ShowDialog();
ILayerFactoryHelper pLayerFactoryHelper = new LayerFactoryHelperClass();
IFileName filename = new FileNameClass();
filename.Path = pOpenfile.FileName;
IEnumLayer enumlayer = pLayerFactoryHelper.CreateLayersFromName(filename as IName);
ILayer layer;
enumlayer.Reset();
layer = enumlayer.Next();
while (layer != null)
{
axSceneControl1.SceneGraph.Scene.AddLayer(layer, false);
layer = enumlayer.Next();
axSceneControl1.SceneGraph.RefreshViewers();
}
}
catch
{
return;
}
}
/// <summary>
/// 打开TIN文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 打开TIN文件ToolStripMenuItem_Click(object sender, EventArgs e)
{
//string dirName;
//ILayer pLayer;
//FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();
//if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
//{
// dirName = folderBrowserDialog1.SelectedPath;
// pLayer = AddData.openTinLayer(dirName);
// if (pLayer != null)
// {
// //axMapControl1.AddLayer(pLayer, 0);
// axSceneControl1.Scene.AddLayer(pLayer, 0);
// }
//}
try
{
FolderBrowserDialog openFileDialog1 = new FolderBrowserDialog();
//openFileDialog1.Title = "添加TIN数据";
//openFileDialog1.Filter = "TIFF格式(*.tif)|*.tif|Img格式(*.img)|*.img|Bmp格式(*.bmp)|*.bmp|Jpeg格式(*.jpg)|*.jpg";
openFileDialog1.ShowDialog();
string sFilePath;
sFilePath = openFileDialog1.SelectedPath;
ITin pTIN = new Tin3DPropertiesClass() as ITin ;
ITinLayer pTINLyr = new TinLayerClass();
pTINLyr.Dataset = pTIN;
//pTINLyr.
axSceneControl1.Scene.AddLayer(pTINLyr);
axSceneControl1.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
//ITin pTIN = new pTIN();
//ITinLayer pTINLyr = new TinLayerClass();
//pTINLyr.Dataset = pTIN;
//axSceneControl1.Scene.AddLayer(pTINLyr);
}
/// <summary>
/// 保存场景图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 保存场景图片ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
string sFileName;
SaveFileDialog pSaveFile = new SaveFileDialog();
pSaveFile.Title = "保存图片";
pSaveFile.Filter = "BMP图片(*.bmp)|*.bmp|JPEG图片(*.jpg)|*.jpg|TIF图片(*.tif)|*.tif";
pSaveFile.ShowDialog();
sFileName = pSaveFile.FileName;
if (pSaveFile.FilterIndex == 1)
{
axSceneControl1.SceneViewer.GetScreenShot(esri3DOutputImageType.BMP, sFileName);
}
else
if (pSaveFile.FilterIndex == 2)
{
axSceneControl1.SceneViewer.GetScreenShot(esri3DOutputImageType.JPEG, sFileName);
}
MessageBox.Show("成功保存图片至:" + sFileName);
}
catch
{
MessageBox.Show("出现错误返回");
}
}
/// <summary>
/// 退出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
}
#endregion
#region //基本操作
//放大
private void button1_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Zoom(0.9);
axSceneControl1.Refresh();
}
//缩小
private void button2_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Zoom(1.1);
axSceneControl1.Refresh();
}
//漫游
private void button3_Click(object sender, EventArgs e)
{
axSceneControl1.Navigate = true;
}
//平移
private void button4_Click(object sender, EventArgs e)
{
scenePan = true;
}
//窗体事件
private void axSceneControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ISceneControlEvents_OnMouseDownEvent e)
{
//鼠标漫游
if (scenePan)
{
//if (CreaterKeyFrameSwitch)
//{
// CreateKeyFrame(axSceneControl1.Scene, Playtrl, KeyIndex);
// KeyIndex = KeyIndex + 1;
//}
if (clickSceneTime == 0)
{
scenePanPoints1.PutCoords(e.x, e.y);
clickSceneTime = 1;
}
else if (clickSceneTime == 1)
{
scenePanPoints2.PutCoords(e.x, e.y);
axSceneControl1.Camera.Pan(scenePanPoints1, scenePanPoints2);
axSceneControl1.Refresh();
clickSceneTime = 0;
scenePan = false;
}
}
//鼠标点击查询
if (pIdnetifyIsOrNot == true)
{
IHit3DSet pHit3DSet;
axSceneControl1.SceneGraph.LocateMultiple(axSceneControl1.SceneGraph.ActiveViewer, e.x, e.y, esriScenePickMode.esriScenePickAll, false, out pHit3DSet);
pHit3DSet.OnePerLayer();
if (pHit3DSet.Hits.Count == 0)
{
MessageBox.Show("当前点未能查找到任何要素");
}
IHit3D pHit3D = pHit3DSet.Hits.get_Element(0) as IHit3D;
pIdnetifyIsOrNot = false;
MessageBox.Show("X =" + pHit3D.Point.X + ",Y=" + pHit3D.Point.Y + ", Z =" + pHit3D.Point.Z);
}
if (e.button == 2)
{
contextMenuSence.Show(this.axSceneControl1, e.x, e.y);
}
}
//自动旋转
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
timer1.Enabled = true;
}
else
{
timer1.Enabled = false;
}
}
//自动旋转的速率控制
private void timer1_Tick(object sender, EventArgs e)
{
axSceneControl1.Camera.Rotate( Convert.ToDouble(comboBox2.Text));
axSceneControl1.Refresh();
}
#endregion
#region //方向控制
//上移
private void button9_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Move(esriCameraMovementType.esriCameraMoveUp, 0.01);
axSceneControl1.Refresh();
}
//左移
private void button10_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Move(esriCameraMovementType.esriCameraMoveLeft, 0.01);
axSceneControl1.Refresh();
}
//右移
private void button12_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Move(esriCameraMovementType.esriCameraMoveRight, 0.01);
axSceneControl1.Refresh();
}
//下移
private void button11_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Move(esriCameraMovementType.esriCameraMoveDown, 0.01);
axSceneControl1.Refresh();
}
//前进
private void button13_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Move(esriCameraMovementType.esriCameraMoveAway, 0.01);
axSceneControl1.Refresh();
}
//后退
private void button14_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Move(esriCameraMovementType.esriCameraMoveToward, 0.01);
axSceneControl1.Refresh();
}
//点击查询
//public Boolean pIdnetifyIsOrNot;
private void button15_Click(object sender, EventArgs e)
{
pIdnetifyIsOrNot = true;
}
#endregion
#region //视屏输出
//保存视频文件
private void button16_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog saveVedioFile = new SaveFileDialog();
saveVedioFile.Filter = "视屏文件(*.avi)|*.avi";
saveVedioFile.Title = "输出AVI文件";
saveVedioFile.ShowDialog();
ISceneExporter3d p3Dexporter = new AVIExporterClass();
p3Dexporter.ExportFileName = saveVedioFile.FileName;
ISceneVideoExporter pExporter;
pExporter = p3Dexporter as ISceneVideoExporter;
pExporter.Viewer = axSceneControl1.Scene.SceneGraph.ActiveViewer;
pExporter.VideoDuration =100 * Convert.ToDouble(comboBox6.Text);
pExporter.FrameRate = 10 * trackBar1.Value;
IAVIExporter pAVIExporter;
pAVIExporter = p3Dexporter as IAVIExporter;
pAVIExporter.Quality = 50 * trackBar2.Value;
p3Dexporter.ExportScene(axSceneControl1.Scene);
MessageBox.Show("输出AVI视屏完成");
}
catch
{
return;
}
}
#endregion
#region //TOC右键功能
private void axTOCControl1_OnMouseDown(object sender,ITOCControlEvents_OnMouseDownEvent e)
{
esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
IBasicMap map = null; ILayer layer = null;
object other = null; object index = null;
axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);
axSceneControl1.CustomProperty = layer;
if (e.button == 2)
{
switch (item)
{
case esriTOCControlItem.esriTOCControlItemLayer:
this.TOCRightLayer = layer;
//this.contextMenuFeaturLayer.Show(this.axTOCControl1, e.x, e.y);
contextMenuSencelayers.Show(this.axTOCControl1, e.x, e.y);
break;
}
}
}
//全屏显示
private void 全屏ToolStripMenuItem_Click(object sender, EventArgs e)
{
//axSceneControl1.Scene.Extent = axSceneControl1.Scene.get_Layer(0);
}
//右键删除
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.axSceneControl1.Scene.DeleteLayer(this.TOCRightLayer);
this.axSceneControl1.Refresh();
}
#endregion
#region //功能实现
//拉伸显示
private void button8_Click(object sender, EventArgs e)
{
try
{
ISceneGraph scenegraph = axSceneControl1.SceneGraph;
IScene scene = scenegraph.Scene;
ILayer layer = scene.get_Layer(0);
IRasterLayer pLayer = layer as IRasterLayer;
IRasterSurface pSurface = new RasterSurface();
IRaster raster = (IRaster)pLayer.Raster;
IRasterBandCollection rasterbands = raster as IRasterBandCollection;
IRasterBand rasterband = rasterbands.Item(0);
pSurface.RasterBand = rasterband;
ISurface surface = pSurface as ISurface;
ILayerExtensions layerextensions = layer as ILayerExtensions;
I3DProperties properties = new Raster3DPropertiesClass();
object p3d;
for (int i = 0; i < layerextensions.ExtensionCount; i++)
{
p3d = layerextensions.get_Extension(i);
if (p3d != null)
{
properties = (I3DProperties)p3d;
break;
}
}
properties.ZFactor = Convert.ToDouble(comboBox7.Text);
properties.BaseOption = esriBaseOption.esriBaseSurface;
properties.BaseSurface = surface;
properties.Apply3DProperties(layer);
axSceneControl1.SceneGraph.RefreshViewers();
}
catch
{
return;
}
}
//地形渲染
private void button7_Click(object sender, EventArgs e)
{
try
{
IScene scene = axSceneControl1.Scene;
ILayer layer = scene.get_Layer(0);
IRasterLayer pRasterLayer = layer as IRasterLayer;
IRaster raster = (IRaster)pRasterLayer.Raster;
IRasterBandCollection rasterbands = raster as IRasterBandCollection;
IRasterBand rasterband = rasterbands.Item(0);
IRasterStretchColorRampRenderer pRStretchRender = new RasterStretchColorRampRendererClass();
//创建两个起始颜色
IRgbColor pFromRgbColor = new RgbColorClass();
pFromRgbColor.Red = 40;
pFromRgbColor.Green = 30;
pFromRgbColor.Blue = 250;
IRgbColor pToRgbColor = new RgbColorClass();
pToRgbColor.Red = 240;
pToRgbColor.Green = 80;
pToRgbColor.Blue = 40;
//创建起止颜色带
IAlgorithmicColorRamp pAlgorithmicColorRamp = new AlgorithmicColorRampClass();
pAlgorithmicColorRamp.Size = 255;
pAlgorithmicColorRamp.FromColor = pFromRgbColor as IColor;
pAlgorithmicColorRamp.ToColor = pToRgbColor as IColor;
bool btrue = true;
pAlgorithmicColorRamp.CreateRamp(out btrue);
//选择拉伸颜色带符号化的波段
pRStretchRender.BandIndex = 1;
//pRStretchRender.BandIndex = pRasterLayer.BandCount;
//设置拉伸颜色带符号化所采用的颜色带
pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp;
IRasterRenderer pRasterRender = pRStretchRender as IRasterRenderer;
pRasterLayer = scene.get_Layer(0) as IRasterLayer;
pRasterRender.Raster = pRasterLayer as IRaster;
pRasterRender.Update();
//符号化RasterLayer
pRasterLayer.Renderer = pRasterRender;
//渲染的刷新
axSceneControl1.Scene.SceneGraph.Invalidate(pRasterLayer, true, false);
axSceneControl1.SceneViewer.Redraw(true);
axSceneControl1.Scene.SceneGraph.RefreshViewers();
axTOCControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, pRasterLayer, axSceneControl1.Scene.Extent);
axTOCControl1.Update();
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//水面渲染
private void button6_Click(object sender, EventArgs e)
{
try
{
ISceneGraph scenegraph = axSceneControl1.SceneGraph;
IScene scene = scenegraph.Scene;
ILayer layer = scene.get_Layer(1);
IRasterLayer pRasterLayer = layer as IRasterLayer;
IRaster raster = (IRaster)pRasterLayer.Raster;
IRasterBandCollection rasterbands = raster as IRasterBandCollection;
IRasterBand rasterband = rasterbands.Item(1);
IRasterStretchColorRampRenderer pRStretchRender = new RasterStretchColorRampRendererClass();
IRasterRenderer pRasterRender = pRStretchRender as IRasterRenderer;
pRasterLayer = scene.get_Layer(1) as IRasterLayer;
pRasterRender.Raster = pRasterLayer as IRaster;
pRasterRender.Update();
//创建两个起始颜色
IRgbColor pFromRgbColor = new RgbColorClass();
pFromRgbColor.Red = 80;
pFromRgbColor.Green = 80;
pFromRgbColor.Blue = 255;
IRgbColor pToRgbColor = new RgbColorClass();
pFromRgbColor.Red = 80;
pFromRgbColor.Green = 80;
pFromRgbColor.Blue = 255;
//创建起止颜色带
IAlgorithmicColorRamp pAlgorithmicColorRamp = new AlgorithmicColorRampClass();
pAlgorithmicColorRamp.Size = 255;
pAlgorithmicColorRamp.FromColor = pFromRgbColor as IColor;
pAlgorithmicColorRamp.ToColor = pToRgbColor as IColor;
bool btrue = true;
pAlgorithmicColorRamp.CreateRamp(out btrue);
//选择拉伸颜色带符号化的波段
pRStretchRender.BandIndex = 1;
//设置拉伸颜色带符号化所采用的颜色带
pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp;
pRasterRender.Update();
//符号化RasterLayer
pRasterLayer.Renderer = pRasterRender;
axSceneControl1.SceneGraph.RefreshViewers();
//渲染的刷新
axSceneControl1.Scene.SceneGraph.Invalidate(pRasterLayer, true, false);
axSceneControl1.SceneViewer.Redraw(true);
axSceneControl1.Scene.SceneGraph.RefreshViewers();
axTOCControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, pRasterLayer, axSceneControl1.Scene.Extent);
axTOCControl1.Update();
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//淹没演示
private void button5_Click(object sender, EventArgs e)
{
try
{
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer = axSceneControl1.Scene.get_Layer(1) as IRasterLayer;
IRaster pRaster = pRasterLayer.Raster;
IRasterLayer mRasterLayer = new RasterLayerClass();
mRasterLayer = axSceneControl1.Scene.get_Layer(0) as IRasterLayer;
IRaster mRaster = mRasterLayer.Raster;
double P = RasterStatistics(mRaster);
startHeight = P;
nowHeight = startHeight;
bool y = Regex.IsMatch(comboBox5.Text,@"[0-9]*[1-9][0-9]*$");
if (y)
{
endHeight = Convert.ToDouble(comboBox5.Text) + P;
timer2.Enabled = true;
P = nowHeight;
axSceneControl1.SceneGraph.RefreshViewers();
}
else
{
MessageBox.Show("请正确输入!");
}
}
catch
{
return;
}
}
//取栅格的最小值
public double RasterStatistics(IRaster pInRaster)
{
IRasterBandCollection pRasterBands = pInRaster as IRasterBandCollection;
IRasterBand pRasterBand = null;
double dZMin = 0;
if (pRasterBands.Count > 0)
{
pRasterBand = pRasterBands.Item(0);
IRasterStatistics pRasterStat = pRasterBand.Statistics;
//double dZMax = pRasterStat.Maximum;
dZMin = pRasterStat.Minimum;
//lblZMax.Text = dZMax.ToString();
return dZMin;
}
return dZMin;
}
//水淹时间控制
private void timer2_Tick(object sender, EventArgs e)
{
try
{
IRasterLayer pRasterLayer = axSceneControl1.Scene.get_Layer(1) as IRasterLayer;
I3DProperties pI3DProperties = new Raster3DPropertiesClass();
ILayerExtensions p = pRasterLayer as ILayerExtensions;
object pp;
int i;
//timer2.Enabled =true;
for (i = 0; i <= p.ExtensionCount - 1; i++)
{
pp = p.get_Extension(i);
if (pp != null)
{
pI3DProperties = p.get_Extension(i) as I3DProperties;
}
axSceneControl1.Refresh();
}
pI3DProperties.BaseOption = esriBaseOption.esriBaseExpression;
nowHeight = nowHeight + 1;
startHeight = nowHeight;
pI3DProperties.BaseExpressionString = nowHeight.ToString();
//pI3DProperties.MaxRasterColumns = nowHeight.ToString();
pI3DProperties.Apply3DProperties(pRasterLayer);
axSceneControl1.SceneGraph.RefreshViewers();
if (nowHeight >= endHeight)
{
timer2.Enabled = false;
//p =bool(false );
//axSceneControl1.SceneGraph.RefreshViewers();
}
}
catch
{
return;
}
}
#endregion
#region // Scene 右键功能
private void 全屏ToolStripMenuItem1_Click(object sender, EventArgs e)
{
//axSceneControl1.Camera = axSceneControl1.Scene.SceneGraph.Extent as ICamera ;
}
private void 漫游ToolStripMenuItem_Click(object sender, EventArgs e)
{
axSceneControl1.Navigate = true;
}
private void 放大ToolStripMenuItem_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Zoom(0.5);
axSceneControl1.Refresh();
//ControlsSceneZoomInTool ScenePan = new ControlsSceneZoomInTool();
//ScenePan.OnCreate(axSceneControl1.Object);
//axSceneControl1.CurrentTool = ScenePan as ITool;
}
private void 缩小ToolStripMenuItem_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Zoom(2.0);
axSceneControl1.Refresh();
//ControlsSceneZoomOutTool SP = new ControlsSceneZoomOutTool();
//SP.OnCreate(axSceneControl1.Object);
//axSceneControl1.CurrentTool = SP as ITool;
}
private void 属性ToolStripMenuItem1_Click(object sender, EventArgs e)
{
pIdnetifyIsOrNot = true;
}
private void 旋转ToolStripMenuItem_Click(object sender, EventArgs e)
{
axSceneControl1.Camera.Rotate(0);
}
private void 刷新ToolStripMenuItem_Click(object sender, EventArgs e)
{
axSceneControl1.SceneGraph.RefreshViewers();
}
#endregion