using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.IO; using GeoScene.Globe; using GeoScene.Data; namespace PipeLine { public partial class CtrlPolylineSpaceInfo : UserControl { public GSOGlobeControl m_GlobeControl = null; public GSOGeometry m_Geometry = null; private int m_nCurSelected = -1; private GSOFeature m_FeatureSelPoint = null; private GSOFeature currentFeature; private GSOLayer layer; public CtrlPolylineSpaceInfo(GSOFeature _feat, GSOLayer _layer, GSOGlobeControl globeControl) { InitializeComponent(); currentFeature = _feat; m_GlobeControl = globeControl; m_Geometry = _feat.Geometry; layer = _layer; } protected override void OnHandleDestroyed(EventArgs e) { base.OnHandleDestroyed(e); if (m_FeatureSelPoint != null) { m_FeatureSelPoint.Delete(); if (m_GlobeControl != null) { m_GlobeControl.Refresh(); } } } private GSOPoint3ds GetCurNodes() { currentFeature.HasModifyFlag(); GSOPoint3ds nodes = null; if (m_Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D geoPolyline3D = currentFeature.Geometry as GSOGeoPolyline3D; if (geoPolyline3D.PartCount > 0) { //一条线由多条子线组成,目前就显示第一条子线的节点内容把 nodes = geoPolyline3D[0]; } } else if (m_Geometry.Type == EnumGeometryType.GeoPolygon3D || m_Geometry.Type == EnumGeometryType.GeoWater) { GSOGeoPolygon3D geoPolygon3D = currentFeature.Geometry as GSOGeoPolygon3D; if (geoPolygon3D.PartCount > 0) { nodes = geoPolygon3D[0]; } } return nodes; } private void UpdateNodeViewList() { currentFeature.HasModifyFlag(); GSOPoint3ds nodes = GetCurNodes(); if (nodes!=null) { listViewNodeList.Items.Clear(); for (int i = 0; i < nodes.Count; i++) { ListViewItem item = new ListViewItem(); item.SubItems[0].Text = i.ToString(); GSOPoint3d pt3d = nodes[i]; GSOPoint2d pt2d = Utility.Latlon_2_XYZ(pt3d.X, pt3d.Y); item.SubItems.Add(pt2d.X.ToString()); item.SubItems.Add(pt2d.Y.ToString()); item.SubItems.Add(pt3d.Z.ToString()); listViewNodeList.Items.Add(item); } } } private void CtrlPolylineSpaceInfo_Load(object sender, EventArgs e) { if (m_Geometry!=null) { UpdateNodeViewList(); } } private void CheckSelFeaturePoint() { if (m_nCurSelected >= 0 && m_nCurSelected < listViewNodeList.Items.Count) { GSOGeoPoint3D geoPoint3D = null; if (m_FeatureSelPoint == null || m_FeatureSelPoint.IsDeleted) { m_FeatureSelPoint = new GSOFeature(); geoPoint3D = new GSOGeoMarker(); GSOMarkerStyle3D style = new GSOMarkerStyle3D(); style.IconPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource/CrossIcon.png"; geoPoint3D.Style = style; m_FeatureSelPoint.Geometry = geoPoint3D; if (m_GlobeControl!=null) { m_GlobeControl.Globe.MemoryLayer.AddFeature(m_FeatureSelPoint); m_GlobeControl.Refresh(); } } geoPoint3D = m_FeatureSelPoint.Geometry as GSOGeoPoint3D; geoPoint3D.AltitudeMode = m_Geometry.AltitudeMode; try { ListViewItem itemSel = listViewNodeList.Items[m_nCurSelected]; GSOPoint2d point2d= Utility.XYZ_2_Latlon(Double.Parse(itemSel.SubItems[1].Text), Double.Parse(itemSel.SubItems[2].Text)); geoPoint3D.X = point2d.X;// Double.Parse(itemSel.SubItems[1].Text); geoPoint3D.Y = point2d.Y;// Double.Parse(itemSel.SubItems[2].Text); geoPoint3D.Z = Double.Parse(itemSel.SubItems[3].Text); } catch (System.Exception exp) { MessageBox.Show(exp.Message ); } if (m_GlobeControl != null) { m_GlobeControl.Refresh(); } } } private void CheckOldAndSetCurSelItem(int nCurItemIndex) { if (m_nCurSelected != nCurItemIndex) { if (m_nCurSelected > -1 && m_nCurSelected < listViewNodeList.Items.Count) { ListViewItem itemOldSel = listViewNodeList.Items[m_nCurSelected]; itemOldSel.ForeColor = Color.Black; itemOldSel.BackColor = SystemColors.Window; } m_nCurSelected = nCurItemIndex; } } private void SelectItem(int nItemIndex) { if (nItemIndex < 0) { return; } int nRealIndex = nItemIndex; if (nRealIndex > listViewNodeList.Items.Count-1) { nRealIndex = listViewNodeList.Items.Count - 1; } CheckOldAndSetCurSelItem(nRealIndex); CheckSelFeaturePoint(); ListViewItem item = listViewNodeList.Items[nRealIndex]; item.Selected = true; item.BackColor = SystemColors.Highlight; item.ForeColor = Color.White; listViewNodeList.SelectedIndices.Clear(); listViewNodeList.SelectedIndices.Add(nRealIndex);//**真正让其选择 } private void listViewNodeList_SelectedIndexChanged(object sender, EventArgs e) { if (listViewNodeList.SelectedItems.Count>0) { ListViewItem item = listViewNodeList.SelectedItems[0]; if (item != null) { CheckOldAndSetCurSelItem(item.Index); CheckSelFeaturePoint(); textBoxX.Text = item.SubItems[1].Text; textBoxY.Text = item.SubItems[2].Text; textBoxZ.Text = item.SubItems[3].Text; } } } private void buttonMoveAllZ_Click(object sender, EventArgs e) { if (m_Geometry != null) { double dZAdded =0; try { dZAdded = Convert.ToDouble(textBoxAllZAdded.Text); m_GlobeControl.Globe.AddToEditHistroy(layer, currentFeature, EnumEditType.Modify); m_Geometry.MoveZ(dZAdded); // 这个比较慢先暂时不用 //UpdateNodeViewList(); for (int i = 0; i < listViewNodeList.Items.Count; i++) { ListViewItem item = listViewNodeList.Items[i]; item.SubItems[3].Text = (Double.Parse(item.SubItems[3].Text) + dZAdded).ToString(); } SelectItem(m_nCurSelected); if (m_GlobeControl!=null) { m_GlobeControl.Refresh(); } } catch (System.Exception exp) { } } } private void buttonAddNode_Click(object sender, EventArgs e) { try { GSOPoint3ds nodes = GetCurNodes(); if (nodes!=null) { GSOPoint3d newPoint = new GSOPoint3d(); newPoint.X = Double.Parse(textBoxX.Text); newPoint.Y = Double.Parse(textBoxY.Text); newPoint.Z = Double.Parse(textBoxZ.Text); /* ListViewItem item = new ListViewItem(); item.SubItems.Add(textBoxX.Text); item.SubItems.Add(textBoxY.Text); item.SubItems.Add(textBoxZ.Text); listViewNodeList.Items.Add(item); */ nodes.Add(newPoint); UpdateNodeViewList(); // 选中最后一个 SelectItem(listViewNodeList.Items.Count - 1); if (m_GlobeControl != null) { m_GlobeControl.Refresh(); } } } catch (System.Exception exp) { } } private void buttonInsertNode_Click(object sender, EventArgs e) { try { if (listViewNodeList.SelectedIndices.Count > 0) { int nSelIndex = listViewNodeList.SelectedIndices[0]; GSOPoint3ds nodes = GetCurNodes(); if (nodes != null && nodes.Count > nSelIndex) { GSOPoint3d newPoint = new GSOPoint3d(); newPoint.X = Double.Parse(textBoxX.Text); newPoint.Y = Double.Parse(textBoxY.Text); newPoint.Z = Double.Parse(textBoxZ.Text); nodes.Insert(nSelIndex, newPoint); /* ListViewItem item = new ListViewItem(); item.SubItems.Add(textBoxX.Text); item.SubItems.Add(textBoxY.Text); item.SubItems.Add(textBoxZ.Text); listViewNodeList.Items.Insert(nSelIndex,item); */ UpdateNodeViewList(); // 选中刚才的那个索引 SelectItem(m_nCurSelected); if (m_GlobeControl != null) { m_GlobeControl.Refresh(); } } } } catch (System.Exception exp) { } } private void buttonModify_Click(object sender, EventArgs e) { try { if (listViewNodeList.SelectedIndices.Count>0) { int nSelIndex = listViewNodeList.SelectedIndices[0]; GSOPoint3ds nodes = GetCurNodes(); if (nodes != null && nodes.Count > nSelIndex) { m_GlobeControl.Globe.AddToEditHistroy(layer, currentFeature, EnumEditType.Modify); GSOPoint3d newPoint = new GSOPoint3d(); newPoint.X = Double.Parse(textBoxX.Text); newPoint.Y = Double.Parse(textBoxY.Text); newPoint.Z = Double.Parse(textBoxZ.Text); GSOPoint2d pt2d = Utility.XYZ_2_Latlon(newPoint.X, newPoint.Y); newPoint.X = pt2d.X; newPoint.Y = pt2d.Y; nodes[nSelIndex] = newPoint; ListViewItem item = listViewNodeList.Items[nSelIndex]; item.SubItems[1].Text = textBoxX.Text; item.SubItems[2].Text = textBoxY.Text; item.SubItems[3].Text = textBoxZ.Text; // 选中刚才的那个索引 //currentFeature.MarkModifyFlag(); SelectItem(m_nCurSelected); if (m_GlobeControl != null) { m_GlobeControl.Refresh(); } //currentFeature.Geometry = currentFeature.Geometry.Clone(); } } } catch (System.Exception ex) { } } private void buttonDelNode_Click(object sender, EventArgs e) { if (listViewNodeList.SelectedIndices.Count>0) { int nSelIndex = listViewNodeList.SelectedIndices[0]; GSOPoint3ds nodes = GetCurNodes(); if (nodes != null && nodes.Count > nSelIndex) { nodes.Remove(nSelIndex); UpdateNodeViewList(); // 选中刚才的那个索引 SelectItem(m_nCurSelected); if (m_GlobeControl != null) { m_GlobeControl.Refresh(); } } } } // 下面两个消息确保listview失去交点的时候选中的对象不消失 private void listViewNodeList_Validated(object sender, EventArgs e) { SelectItem(m_nCurSelected); } private void listViewNodeList_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) { e.DrawBackground(); Rectangle r = e.Bounds; r.Width -= 1; Color c = Color.FromArgb(207, 221, 238); e.Graphics.FillRectangle(new SolidBrush(c), r); e.DrawText(); } private void listViewNodeList_DrawItem(object sender, DrawListViewItemEventArgs e) { e.DrawDefault = true; } } }