Newer
Older
GHFX_REFACTOR / FormAnalysis / FormFT.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using GeoScene.Globe;
using GeoScene.Data;
using GeoScene.Engine;

namespace Cyberpipe.FormAnalysis
{
    public partial class FormFT : Office2007Form
    {
        GSOGlobeControl globeControl1 = null;
        int maxPageIndex = 20;
        int rows = 0;
        public static GSODataSource ds = null;
        private GSOFeatures features = null;
        private GSOLayer layerTemp = null;

        public FormFT(GSOFeatures _features, GSOGlobeControl _globeControl, GSOLayer _layerTemp)
        {
            InitializeComponent();
            features = _features;
            globeControl1 = _globeControl;
            layerTemp = _layerTemp;
        }

        private void FormFT_Load(object sender, EventArgs e)
        {
            InitWinGridView.initlizeDatagrid(winGridViewPager1, rows, maxPageIndex);
            InitWinGridView.initlizeDatagrid(winGridViewPager2, rows, maxPageIndex);
            initlizeDatagrid();
            addFeaturesToDataGridView(features);
            this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected);//属性编辑
            this.winGridViewPager2.OnEditSelected += new EventHandler(winGridViewPager2_OnEditSelected);//属性编辑

        }

        /// <summary>
        /// 初始化分页表格
        /// </summary>
        private void initlizeDatagrid()
        {
            winGridViewPager1.AddColumnAlias("审核图层", "审核图层");
            winGridViewPager1.AddColumnAlias("编号", "编号");
            winGridViewPager1.DisplayColumns = "审核图层,编号";

            winGridViewPager2.AddColumnAlias("审核图层", "审核图层");
            winGridViewPager2.AddColumnAlias("审核编号", "审核编号");
            winGridViewPager2.AddColumnAlias("埋深/m", "埋深/m");
            winGridViewPager2.DisplayColumns = "审核图层,审核编号,埋深/m";
        }

        private void addFeaturesToDataGridView(GSOFeatures features)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("审核图层");
            dt.Columns.Add("编号");
            for (int i = 0; i < features.Length; i++)
            {
                DataRow r = dt.NewRow();
                r[0] = features[i].Dataset.Name;
                r[1] = features[i].Name;
                dt.Rows.Add(r);
            }
            winGridViewPager1.DataSource = dt.DefaultView;
        }

        private void buttonOK_Click(object sender, EventArgs e)
        {
            if (textBoxFTSD.Text.Trim() == "")
            {
                MessageBox.Show("覆土深度不能为空!", "提示");
                return;
            }
            double dFuTuShenDu = 0;
            if (!double.TryParse(textBoxFTSD.Text.Trim(), out dFuTuShenDu))
            {
                MessageBox.Show("请输入正确的覆土深度!", "提示");
                return;
            }

            DataTable dt = new DataTable();
            dt.Columns.Add("审核图层");
            dt.Columns.Add("审核编号");
            dt.Columns.Add("埋深/m");

            for (int i = 0; i < winGridViewPager1.dataGridView1.Rows.Count; i++)
            {
                GSOLayer layer =
                    globeControl1.Globe.Layers.GetLayerByCaption(
                        winGridViewPager1.dataGridView1.Rows[i].Cells[0].Value.ToString());
                GSOFeatures features =
                    layer.GetFeatureByName(winGridViewPager1.dataGridView1.Rows[i].Cells[1].Value.ToString(), true);
                GSOFeature rowFeature = features[0];


                GSOGeoPolyline3D line = rowFeature.Geometry as GSOGeoPolyline3D;
                if (line == null)
                {
                    continue;
                }
                GSOPipeLineStyle3D style = line.Style as GSOPipeLineStyle3D;
                if (style == null)
                {
                    continue;
                }
                if (line.PartCount <= 0) continue;
                GSOPoint3ds pts = line[0];
                GSOPoint3d pt = new GSOPoint3d();

                for (int m = 0; m < pts.Count; m++)
                {
                    if (Math.Abs(pts[m].Z + (style.Radius)) < Convert.ToDouble(textBoxFTSD.Text.Trim()))
                    {
                        DataRow row = dt.NewRow();
                        row[0] = rowFeature.Dataset.Caption;
                        row[1] = rowFeature.Name;
                        row[2] = Math.Abs((pts[m].Z + (style.Radius))).ToString("0.00");
                        dt.Rows.Add(row);

                        pt.X = pts[m].X;
                        pt.Y = pts[m].Y;
                        pt.Z = 0;
                        LabelVerticalDistance(layerTemp, pts[m], pt,
                            Convert.ToDouble(Math.Abs((pts[m].Z + (style.Radius))).ToString("0.00")), true);
                        break;
                    }
                }
            }
            winGridViewPager2.DataSource = dt.DefaultView;
            globeControl1.Refresh();
            if (winGridViewPager2.dataGridView1.Rows.Count == 0)
            {
                MessageBox.Show("所有管线满足覆土净距标准!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

        /// <summary>
        /// 在指定的两点组成的线的中间添加一个marker对象,并将marker对象添加到指定的图层中
        /// </summary>
        /// <param name="markerLayer"></param>
        /// <param name="pntIntersect1"></param>
        /// <param name="pntIntersect2"></param>
        /// <param name="distance"></param>
        /// <returns></returns>
        private GSOPoint3d LabelVerticalDistance(GSOLayer markerLayer, GSOPoint3d pntIntersect1, GSOPoint3d pntIntersect2, double distance, bool markerVisible)
        {
            if (pntIntersect1 == null || pntIntersect2 == null)
            {
                return new GSOPoint3d();
            }

            GSOGeoPolyline3D disline = new GSOGeoPolyline3D();
            GSOPoint3ds point3Ds = new GSOPoint3ds();
            point3Ds.Add(pntIntersect1);
            point3Ds.Add(pntIntersect2);
            disline.AddPart(point3Ds);
            GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); //创建线的风格
            //设置透明度及颜色,FromArgb()中的四个参数分别为alpha、red、green、blue,取值范围为0到255
            style.LineColor = Color.GreenYellow;
            style.LineWidth = 3;          //设置线的宽度为3
            style.VertexVisible = true; 	//显示线的节点
            disline.Style = style;          //把风格添加到线上
            disline.AltitudeMode = EnumAltitudeMode.Absolute;

            GSOFeature line = new GSOFeature();
            line.Geometry = disline;

            GSOGeoMarker dismarker = new GSOGeoMarker();
            dismarker.X = pntIntersect1.X;
            dismarker.Y = pntIntersect1.Y;
            dismarker.Z = (pntIntersect1.Z + pntIntersect2.Z) / 2;

            string disStr = distance.ToString("0.00");
            if (disStr != "0.00")
            {
                dismarker.Text = distance.ToString("0.00") + "米";
            }
            else
            {
                dismarker.Text = "交叉";
            }
            dismarker.AltitudeMode = EnumAltitudeMode.Absolute;
            GSOMarkerStyle3D styleMarker = new GSOMarkerStyle3D();
            GSOTextStyle styleText = new GSOTextStyle();
            styleText.IsSizeFixed = true;
            styleText.ForeColor = Color.White;
            styleText.FontSize = 20;
            styleMarker.TextStyle = styleText;
            dismarker.Style = styleMarker;

            GSOFeature marker = new GSOFeature();
            marker.Geometry = dismarker;

            line.Visible = marker.Visible = markerVisible;

            markerLayer.AddFeature(line);
            markerLayer.AddFeature(marker);

            return dismarker.Position;
        }

        private void winGridViewPager1_OnEditSelected(object sender, EventArgs e)
        {
            DataGridView grid = sender as DataGridView;
            if (grid == null || grid.SelectedRows.Count <= 0)
            {
                MessageBox.Show("没有选择记录", "提示");
                return;
            }
            DataGridViewRow row = grid.SelectedRows[0];
            try
            {
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(row.Cells[0].Value.ToString());
                GSOFeatures features = layer.GetFeatureByName(row.Cells[1].Value.ToString(), true);
                globeControl1.Globe.FlyToFeature(features[0]);
            }
            catch (Exception ex)
            {
                MessageBox.Show("定位失败:" + ex, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void winGridViewPager2_OnEditSelected(object sender, EventArgs e)
        {
            DataGridView grid = sender as DataGridView;
            if (grid == null || grid.SelectedRows.Count <= 0)
            {
                MessageBox.Show("没有选择记录", "提示");
                return;
            }
            DataGridViewRow row = grid.SelectedRows[0];
            try
            {
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(row.Cells[0].Value.ToString());
                GSOFeatures features = layer.GetFeatureByName(row.Cells[1].Value.ToString(), true);
                globeControl1.Globe.FlyToFeature(features[0]);
            }
            catch (Exception ex)
            {
                MessageBox.Show("定位失败:" + ex, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}