標籤:get strong os art 類 cti
AE三維點擊查詢(3D Identify)的實現,類似ArcGIS的Identify對話方塊
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function: 三維點擊查詢 3D Identify
// Copyright © 天下無雙之dxcgis
// 2008-5-8 於嶽麓山下。
主表單中的代碼:
// 在主表單中定義一個frmIdentify表單類的對象
frmIdentify m_frmIdentify = new frmIdentify();
// SceneControl1的MouseDown 事件中添加代碼
private void axSceneControl1_OnMouseDown(object sender, ISceneControlEvents_OnMouseDownEvent e)
{
//三維查詢
axSceneControl1.SceneGraph.IsNavigating = false;
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("當前點未能尋找到任何要素");
return;
}
IDisplay3D pDisplay3D = (IDisplay3D)axSceneControl1.Scene.SceneGraph;//用於高亮顯示要素
//顯示資訊表單
m_frmIdentify.listBox1.Items.Clear();
m_frmIdentify.listView1.Items.Clear();
m_frmIdentify.pHit3DSet = pHit3DSet;
m_frmIdentify.pDisplay3D = pDisplay3D;
m_frmIdentify.InitData();
m_frmIdentify.Location = System.Windows.Forms.Cursor.Position; //獲得當前滑鼠的螢幕座標
m_frmIdentify.Show();
m_frmIdentify.Focus();
}
3D Identify 表單(frmIdentify)的代碼:
public partial class frmIdentify : Form
{
public IHit3DSet pHit3DSet;
public IDisplay3D pDisplay3D;
public frmIdentify()
{
InitializeComponent();
}
private void frmIdentify_Load(object sender, EventArgs e)
{
}
private void btnHide_Click(object sender, EventArgs e)
{
this.Hide();
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
listView1.Items.Clear();//消除 listView1 的內容
IHit3D pHit3D = (IHit3D)pHit3DSet.Hits.get_Element(listBox1.SelectedIndex);
IFeature pFeature = (IFeature)pHit3D.Object;
for (int j = 0; j < pFeature.Fields.FieldCount; j++)
{
ListViewItem li = new ListViewItem();
li.SubItems.Clear();
li.SubItems[0].Text = pFeature.Fields.get_Field(j).Name;
li.SubItems.Add(pFeature.get_Value(j).ToString());
listView1.Items.Add(li);
}
//pDisplay3D.AddFlashFeature(pFeature.Shape);
pDisplay3D.FlashGeometry(pHit3D.Owner,pHit3D.Object);
}
//自己添加的方法,用以初始化表單。
public void InitData()
{
listBox1.Items.Clear();//消除 listBox1 的內容
listView1.Items.Clear();//消除 listView1 的內容
if (pHit3DSet == null)
return;
for (int i = 0; i < pHit3DSet.Hits.Count; )
{
IHit3D pHit3D = (IHit3D)pHit3DSet.Hits.get_Element(i);
IPoint pPoint = pHit3D.Point;
//if (pPoint.IsEmpty)
// return;
ILayer pLayer = (ILayer)pHit3D.Owner;
//判斷是否為要素圖層
if (pLayer is IFeatureLayer)
{
IFeature pFeature = (IFeature)pHit3D.Object;
listBox1.Items.Add(pLayer.Name);//在列表中添加圖層名
//for (int j = 0; j < pFeature.Fields.FieldCount; j++)
// strHits += "\n :" + pFeature.Fields.get_Field(j).Name + pFeature.get_Value(j).ToString();
pDisplay3D.AddFlashFeature(pFeature.Shape);
i++; //計數i加1
}
else
{
//不是要素層就從pHit3DSet中刪去,因刪除後總數減1,計數i不加1
pHit3DSet.Hits.Remove(i);
}
}
pDisplay3D.FlashFeatures();
}
}
轉自ESRI官論壇的dxcGIS